Инжектированые каналы АЦП STM32F4 DISCOVERY

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Вт дек 10, 2013 21:06:13

Сообщение OptiMAL »

Доброго времени суток!

Возникла следующая проблема с АЦП, а точнее с результатом преобразования.

Привожу код:

Код: Выделить всё


#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. Остальные переменные равны нулю.
Господа, в чём может быть проблема?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

В бесконечном цикле, неплохо бы проверять 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;

    }
Все будет только лучше, в крайнем случае - хуже.
Реклама
Родился
Сообщения: 3
Зарегистрирован: Вт дек 10, 2013 21:06:13

Сообщение OptiMAL »

Попробовал. К сожалению, по прежнему работает только один канал.
В отладчике по-крайней мере.

Ещё какие варианты?
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

Сегодня вечером "в железе" проверю, потом отпишусь. Мне ADC в таком режиме пока не было надобности использовать.
Все будет только лучше, в крайнем случае - хуже.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 3
Зарегистрирован: Вт дек 10, 2013 21:06:13

Сообщение OptiMAL »

Задача решена :)

Итак:
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 инжектированных канала :)
Причём каждый канал имеет свою погрешность.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

Ну и замечательно :beer: А я только собрался поковыряться, а Вы уже все сделали.
Самые опасные грабли - детские. Взрослые бьют по лбу, а вот детские... :)
Все будет только лучше, в крайнем случае - хуже.
Реклама
Ответить

Вернуться в «ARM»