реклама на сайте
подробности

 
 
> STM32F103C8T6, АЦП, DMA и таймер, Не регулируется частота выборок
hd44780
сообщение Feb 16 2017, 16:31
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Привет всем.
Пытаюсь оцифровать этим процом переменку из розетки (т.е. просто сделать вольтметр).
Перед тем как попасть в проц, переменка проходит через обычный транс от БП (для развязки), потенциометр для подгонки по диапазон, поднимается на 1.5в вверх, чтобы измерять обе полуволны, а не одну.
О том, зачем так сложно, прошу не задумываться, это часть более сложной конструкции.

Виртуальная земля и синусоида из розетки цифруются АЦП проца+таймер+DMA. Эта связка отлажена и работает.

АЦП запускаю по Timer 2 CC2 event:
Код
    // ADC1 configuration ------------------------------------------------------
    ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;            // -> CR1 | 0x00060000
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;    // T2, канал 2 --> CR2
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 2;            // --> ADCx->SQR1
    ADC_Init ( ADC1, &ADC_InitStructure );


Настройка таймера TIM2, CCR2:
Код
   /* TIM2 configuration ------------------------------------------------------*/
   // Time Base configuration
   // TIM2 - APB1, 72MHz
   // Ft = Fapb1/(PSC+1) = 72E6/(PSC+1) = 72E6/1800=40000
   TIM_TimeBaseStructInit ( &TIM_TimeBaseStructure );
   TIM_TimeBaseStructure.TIM_Period = 20-1;               // -> ARR - До этого значения считает таймер
   TIM_TimeBaseStructure.TIM_Prescaler = 1800-1;               // -> PSC - делитель частоты шины, Ft = 40kHz
   TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;            //
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit ( TIM2, &TIM_TimeBaseStructure );

   // TIM1 channel1 configuration in PWM mode
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
   TIM_OCInitStructure.TIM_Pulse = 10;                     // CCR2
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
   TIM_OC2Init ( TIM2, &TIM_OCInitStructure );


DMA не привожу, там проблем вроде не заметил.
Проблема только лишь в том, что я планировал получить в буфере не 2 периода частоты 50 Гц, а 20 biggrin.gif График из экселя приложил.

по моим подсчётам частота запуска АЦП должна быть 40кГц/AAR = 40kHz/2 = 2КГц, но в буфере я вижу 2 периода входной частоты 50 Гц.
Буфер - 1000 значений.
Почему 2, я понять не могу. 2кГц = 2000 значений в секунду, в буфере 1000 значений за 0.5 сек. Это должно быть 500ms/20ms=25 периодов.
Почему у меня их 2? В чём я ошибаюсь?
Что самое интересное, что ради экперимента я пытался пихать в ARR и PSC разные числа - по фигу совершенно, там всегда 2 периода!

Сижу над этим уже 3 дня, не могу понять crying.gif smile3046.gif
В эррате ничего путного не нашёл.

Спасибо.

PS. Про странную форму графика с какими-то разрывами я уж молчу.
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 23:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016