| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Инжектированые каналы АЦП STM32F4 DISCOVERY https://radiokot.ru/forum/viewtopic.php?f=59&t=97913 |
Страница 1 из 1 |
| Автор: | OptiMAL [ Вт дек 10, 2013 21:19:03 ] |
| Заголовок сообщения: | Инжектированые каналы АЦП STM32F4 DISCOVERY |
Доброго времени суток! Возникла следующая проблема с АЦП, а точнее с результатом преобразования. Привожу код: Код: #include "stm32f4xx.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_tim.h" int main(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);// 42 MHz RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 84 MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); // 42 MHz GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_InitStructure.TIM_ClockDivision = 42; // 1 MHz TIM_InitStructure.TIM_Prescaler = 101; // 10 kHz TIM_InitStructure.TIM_Period = 9; // 1000 Hz TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM5, &TIM_InitStructure); TIM_SelectOutputTrigger(TIM5, TIM_TRGOSource_Update); TIM_Cmd(TIM5, ENABLE); ADC->CCR |= ADC_CCR_ADCPRE_0; //Предделитель 84 MHz / 4 = 21 MHz ADC->CCR &= ADC_CCR_MULTI; //Независимый режим ADC1->CR2 &=~ ADC_CR2_ALIGN; //Данные справа ADC1->CR2 |= ( ADC_CR2_JEXTSEL_0 | ADC_CR2_JEXTSEL_1 | ADC_CR2_JEXTSEL_3); //Триггер таймера 5 ADC1->CR2 |= ADC_CR2_JEXTEN_0; // По переднему фронту ADC1-> CR1 &=~ ADC_CR1_RES; // 12 бит ADC1->JSQR |= (1<<20) | (1<<21); //4 преобразования ADC1->JSQR |= (1<<0) | (1<<6) | (1<<10) | (1<<11) | (1<<18); //Каналы с 1 по 4 ADC1->CR2 |= ADC_CR2_ADON; uint32_t adc_res1=0; uint32_t adc_res2=0; uint32_t adc_res3=0; uint32_t adc_res4=0; while(1) { ADC1->CR2 |= ADC_CR2_JSWSTART; adc_res1=ADC1->JDR1; adc_res2=ADC1->JDR2; adc_res3=ADC1->JDR3; adc_res4=ADC1->JDR4; } } Собственно результат имеется только в adc_res1. Остальные переменные равны нулю. Господа, в чём может быть проблема? |
|
| Автор: | coredumped [ Вт дек 10, 2013 22:43:32 ] |
| Заголовок сообщения: | Re: Инжектированые каналы АЦП STM32F4 DISCOVERY |
В бесконечном цикле, неплохо бы проверять ADC->SR на предмет окончания преобразования (флаг JEOC). Вы непрерывно перезапускаете конвертирование, не дождавшись окончания операции. Думаю правильно будет так: Код: while(1)
{ ADC1->CR2 |= ADC_CR2_JSWSTART; while((ADC1->SR & ADC_SR_JEOC)==0) {}; adc_res1=ADC1->JDR1; adc_res2=ADC1->JDR2; adc_res3=ADC1->JDR3; adc_res4=ADC1->JDR4; } |
|
| Автор: | OptiMAL [ Ср дек 11, 2013 16:20:55 ] |
| Заголовок сообщения: | Re: Инжектированые каналы АЦП STM32F4 DISCOVERY |
Попробовал. К сожалению, по прежнему работает только один канал. В отладчике по-крайней мере. Ещё какие варианты? |
|
| Автор: | coredumped [ Ср дек 11, 2013 17:21:10 ] |
| Заголовок сообщения: | Re: Инжектированые каналы АЦП STM32F4 DISCOVERY |
Сегодня вечером "в железе" проверю, потом отпишусь. Мне ADC в таком режиме пока не было надобности использовать. |
|
| Автор: | OptiMAL [ Ср дек 11, 2013 18:50:54 ] |
| Заголовок сообщения: | Re: Инжектированые каналы АЦП STM32F4 DISCOVERY |
Задача решена Итак: 1. Ошибка: Не было выбрано режим преобразования. Решение: Код: ADC1->CR1 |= ADC_CR1_SCAN; //Поочереди каждый канал. 2. Ошибка: Биты сместились не правильно, не настроив каналы должным образом. Код: ADC1->JSQR |= (1<<0) | (1<<6) | (1<<10) | (1<<11) | (1<<18); //Каналы с 1 по 4 Решение: Код: ADC1->JSQR |= (ADC_JSQR_JSQ4_2); // Группа 4, канал 4 ADC1->JSQR |= (ADC_JSQR_JSQ3_0 | ADC_JSQR_JSQ3_1); // Группа 3, канал 3 ADC1->JSQR |= (ADC_JSQR_JSQ2_1); // Группа 2, канал 2 ADC1->JSQR |= (ADC_JSQR_JSQ1_0); // Группа 1, канал 1 3. Нужно дождаться конца преобразования. Решение: Указано coredumped . Вот таким образом удалось настроить 4 инжектированных канала Причём каждый канал имеет свою погрешность. |
|
| Автор: | coredumped [ Ср дек 11, 2013 21:33:08 ] |
| Заголовок сообщения: | Re: Инжектированые каналы АЦП STM32F4 DISCOVERY |
Ну и замечательно А я только собрался поковыряться, а Вы уже все сделали.Самые опасные грабли - детские. Взрослые бьют по лбу, а вот детские... |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|



А я только собрался поковыряться, а Вы уже все сделали.