Например TDA7294

Форум РадиоКот :: Просмотр темы - Инжектированые каналы АЦП STM32F4 DISCOVERY
Форум РадиоКот
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

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/