STM32 Первый старт
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: STM32 TIM1+Прерывание
Большое Вам спасибо ) Все ясно )
- Реклама
Re: STM32 TIM1+Прерывание
На kazus.ru...SubDia писал(а): (Вы, кстати, не модератор на одном из подобных сайтов, аль обознался я?)
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: STM32 TIM1+Прерывание
Если нужно сначала померять U на 10 канале затем U на 11 ?
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //Подключаем АЦП к линии тактирования
RCC->CFGR |= RCC_CFGR_ADCPRE; //Предделитель на максимум (на
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV8;
ADC1->CR2 |= ADC_CR2_CAL; //Запуск калибровки (это нужно сделать ДО установки ADON)
while (!(ADC1->CR2 & ADC_CR2_CAL))
{
}
ADC1->SQR3 |= (ADC_SQR3_SQ1_3 | ADC_SQR3_SQ1_1); // 10 канал, 1 преобразование PC0
ADC1->SQR3|= (ADC_SQR3_SQ2_3 | ADC_SQR3_SQ2_1|ADC_SQR3_SQ2_0); // 11 канал, 2 преобразование PC1 (добавил)
ADC1->CR2 |= (ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTTRIG);
ADC1->CR2 |= ADC_CR2_ADON;
GPIOC->CRL &= ~GPIO_CRL_CNF0; //Аналоговый вход (это АЦП, 10й канал) PC0
GPIOC->CRL &= ~GPIO_CRL_MODE0;
GPIOC->CRL &= ~GPIO_CRL_CNF1; //Аналоговый вход (это АЦП, 11й канал) PC1
GPIOC->CRL &= ~GPIO_CRL_MODE1;
void ADC_RBat(void)
{
ADC1->CR2 |= ADC_CR2_SWSTART; //Запуск преобразования
while (!(ADC1->SR & ADC_SR_EOC)) //Ждем окончания преобразования
adc = ADC1->DR; //Считываем данные (раньше так только с одного канала считывали а как с 2 или больше ? )
}
RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //Подключаем АЦП к линии тактирования
RCC->CFGR |= RCC_CFGR_ADCPRE; //Предделитель на максимум (на
RCC->CFGR |= RCC_CFGR_ADCPRE_DIV8;
ADC1->CR2 |= ADC_CR2_CAL; //Запуск калибровки (это нужно сделать ДО установки ADON)
while (!(ADC1->CR2 & ADC_CR2_CAL))
{
}
ADC1->SQR3 |= (ADC_SQR3_SQ1_3 | ADC_SQR3_SQ1_1); // 10 канал, 1 преобразование PC0
ADC1->SQR3|= (ADC_SQR3_SQ2_3 | ADC_SQR3_SQ2_1|ADC_SQR3_SQ2_0); // 11 канал, 2 преобразование PC1 (добавил)
ADC1->CR2 |= (ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTTRIG);
ADC1->CR2 |= ADC_CR2_ADON;
GPIOC->CRL &= ~GPIO_CRL_CNF0; //Аналоговый вход (это АЦП, 10й канал) PC0
GPIOC->CRL &= ~GPIO_CRL_MODE0;
GPIOC->CRL &= ~GPIO_CRL_CNF1; //Аналоговый вход (это АЦП, 11й канал) PC1
GPIOC->CRL &= ~GPIO_CRL_MODE1;
void ADC_RBat(void)
{
ADC1->CR2 |= ADC_CR2_SWSTART; //Запуск преобразования
while (!(ADC1->SR & ADC_SR_EOC)) //Ждем окончания преобразования
adc = ADC1->DR; //Считываем данные (раньше так только с одного канала считывали а как с 2 или больше ? )
}
Re: STM32 TIM1+Прерывание
В вашем примере вы прочитаете только одно преобразование.Victor Gordienko писал(а):](раньше так только с одного канала считывали а как с 2 или больше ? )
}
Есть несколько путей для считывания нескольких.
1. Также как раньше, только по очереди, каждый раз перенастраивая ADC на нужный канал. К сожалению у обычной группы каналов только одна выходная ячейка для помещения результатов.
2. Использовать инжектированную группу каналов. Для инжектированной группы есть 4 регистра для помещения результатов. Соотв нужно использовать ADC_JSQR регистр для настройки каналов и еще другие настройки для работы с инжектированными каналами. По инжектированным каналам за раз можно сделать до 4 преобразований. Название инжектированные происходит от того, что эти преобразования могут временно прерывать серию обычных преобразований. Но могут использоваться и отдельно Обратите внимание на порядок преобразований в инжектированной группе. Там были какие то подводные камни, описанные в документации. То ли первый канал в последней ячейке, то ли обратный порядок преобразования в группе. Нужно смотреть документацию внимательней.
3. Использовать 1 обычный и один инжектированный канал. Где-то есть флаг для запуска инжектированной группы после основной. В основной 1 преобразование и в инжектироавнной 1 преобразование.
4. Использовать DMA для передачи только что преобразованных данных обычных каналов. Такой подход использовал я при управлении источником питания на stm32f100с4 (статья на этом сайте). Нужно было считать значения напряжения и тока. Кроме того там используется и запуск инжектированного канала после основного но уже без DMA (3 вариант). Также можно посмотреть.
5. Использовать для считывания обычных каналов прерывание.
Re: STM32 Первый старт
Здравствуйте! Кто уже запускал ацп, поделитесь впечатлениями. Как уровень шумов? У меня пока получается +-8 ЕМР. т.е из 12 бит реально только 8 получается снять((.
- Реклама
- SubDia
- Держит паяльник хвостом
- Сообщения: 995
- Зарегистрирован: Сб апр 02, 2011 17:59:22
- Откуда: Город-герой Севастополь
Re: STM32 Первый старт
У меня достаточно высок уровень шумов - прыжки на десятках милливольт. Правда, грешу на свои ручонки - плату грамотнее разводить нужно было.
Применяю алгоритм усреднения результатов в управляющей программе на ПК.
Применяю алгоритм усреднения результатов в управляющей программе на ПК.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: STM32 Первый старт
На линейность хар-ки и прочие специфические параметры не проверял, но АЦП достаточно хорошее.
В самых первых экспериментах подключал ко входу обычный переменник, значения плавали +- 1 ед
http://ziblog.ru/2011/01/15/stm32-chast ... atel-atsp/
В самых первых экспериментах подключал ко входу обычный переменник, значения плавали +- 1 ед
http://ziblog.ru/2011/01/15/stm32-chast ... atel-atsp/
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
Re: STM32 Первый старт
Может кто подскажет по АЦП ?Zheleznjakov писал(а):На линейность хар-ки и прочие специфические параметры не проверял, но АЦП достаточно хорошее.
Запуск взят из примеров к библиотеке от ST, измеряем Vref, но что-то значения сильно гуляют
Код: Выделить всё
uint16_t ADC_res;
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA| RCC_APB2Periph_USART1|
RCC_APB2Periph_AFIO,ENABLE);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_NbrOfChannel=1;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
ADC_InitStructure.ADC_ScanConvMode=DISABLE;
ADC_TempSensorVrefintCmd(ENABLE);
ADC_Init(ADC1,&ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,1,ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC1, ENABLE);
USART_SendStr(USART1,"Reset calibration\r\n");
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)) {}
USART_SendStr(USART1,"Calibration\r\n");
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1)) {}
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
Код: Выделить всё
while (ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET) {}
ADC_res=ADC_GetConversionValue(ADC1);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
В итоге за 905 секунд значения полученные с АЦП min:1488 max:1535 delta:47
Что-то великоват разброс для Vref
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: STM32 Первый старт
Вообще советуют на время преобразования переходить в режим sleep(т.е отключать обработку проги) по __WFI(), но у меня пока это результата не дало((
Re: STM32 Первый старт
Про sleep понятно, но мне кажется это надо при "борьбе за повышенную" точность.
В моем случае - меряем ИОН, и получаем +-20 ед. Многовато..
В моем случае - меряем ИОН, и получаем +-20 ед. Многовато..
— Не говорите мне что делать и я не скажу куда Вам идти...
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: STM32 Первый старт
Вероятно влияет само АЦП, нужно увеличить его входное сопротивление для этого максимально увеличить время преобразования.
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: STM32 Первый старт
Не удержался решил попробовать, вот что получилось
при 1.5 cycles значение 0x66D-0x66E
при 239.5 cycles значение 0x675-0x676
т.е. не так уж и сильно пляшут.
плата STM32-Discovery
при 1.5 cycles значение 0x66D-0x66E
при 239.5 cycles значение 0x675-0x676
т.е. не так уж и сильно пляшут.
плата STM32-Discovery
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
Re: STM32 Первый старт
Спасибо за тест!Zheleznjakov писал(а):Не удержался решил попробовать, вот что получилось
при 1.5 cycles значение 0x66D-0x66E
при 239.5 cycles значение 0x675-0x676
т.е. не так уж и сильно пляшут.
плата STM32-Discovery
Хм... 1504 : 2412: min:1503 max:1511 delta:8
или 0x5DF-0x5E7 это при 239.5 циклов.
Плата самодельная, емкости по питанию стоят непосредственно у ног контроллера.
Тактовая 72МГц, делитель ЦАП - 8.
Кусок кода:
Код: Выделить всё
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
RCC_GetClocksFreq(&clk);
USART_SendStr(USART1,_int2strr(clk.ADCCLK_Frequency));
Попробую на discovery... Может, что-то в datasheet упустил - какие-то особенности монтажа.
— Не говорите мне что делать и я не скажу куда Вам идти...
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: STM32 Первый старт
А какой мк, а то у меня есть ещё вот такая плата
http://ziblog.ru/2011/03/25/demka-dlya-stm32f103cb/
попробую проверить на ней.
http://ziblog.ru/2011/03/25/demka-dlya-stm32f103cb/
попробую проверить на ней.
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
Re: STM32 Первый старт
МК stm32f103cbt.Zheleznjakov писал(а):А какой мк, а то у меня есть ещё вот такая плата
http://ziblog.ru/2011/03/25/demka-dlya-stm32f103cb/
попробую проверить на ней.
Плата аналогичная, своя:
- Вложения
-
- 16082011129s.jpg
- (31.09 КБ) 5177 скачиваний
— Не говорите мне что делать и я не скажу куда Вам идти...
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: STM32 Первый старт
Мыльни код, что бы мне не писать
можешь просто прошивку, только скажи какой порт USART
можешь просто прошивку, только скажи какой порт USART
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
Re: STM32 Первый старт
Саму библиотеку от ST я туда не пихал.Zheleznjakov писал(а):Мыльни код, что бы мне не писать
можешь просто прошивку, только скажи какой порт USART
USART1, компилятор от CodeSourcery
- Вложения
-
- ADC.zip
- (89.51 КБ) 342 скачивания
— Не говорите мне что делать и я не скажу куда Вам идти...
Re: STM32 Первый старт
В файле rename_to_hex.jpg прошивка - надо переименовать.Zheleznjakov писал(а):Мыльни код, что бы мне не писать
можешь просто прошивку, только скажи какой порт USART
- Вложения
-
- rename_to_hex.jpg
- (27.53 КБ) 661 скачивание
— Не говорите мне что делать и я не скажу куда Вам идти...
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: STM32 Первый старт
На моей плате то же самое 
min:1493 max:1501 delta:8
min:1493 max:1501 delta:8
Провел дополнительно пару тестов., см рисунки (прога самописная, вся шакала 256=1, т.е. вывожу младший байт)
рис2 - ожидаю-считываю-запускаю-посылаю (АЦП 14 МГц) рис1 - запускаю-ожидаю-считываю-посылаю (АЦП 14 МГц) видно что на втором случае лучше результат, видимо сказывается передача по уарт во время преобразования.
min:1493 max:1501 delta:8
min:1493 max:1501 delta:8
Провел дополнительно пару тестов., см рисунки (прога самописная, вся шакала 256=1, т.е. вывожу младший байт)
рис2 - ожидаю-считываю-запускаю-посылаю (АЦП 14 МГц) рис1 - запускаю-ожидаю-считываю-посылаю (АЦП 14 МГц) видно что на втором случае лучше результат, видимо сказывается передача по уарт во время преобразования.
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: STM32 Первый старт
Изменил время преобразования с 55 до 239
- Вложения
-
- рис3.JPG
- (34.02 КБ) 1040 скачиваний
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru


