Пытаюсь оцифровать этим процом переменку из розетки (т.е. просто сделать вольтметр).
Перед тем как попасть в проц, переменка проходит через обычный транс от БП (для развязки), потенциометр для подгонки по диапазон, поднимается на 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 );
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 );
// 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

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


В эррате ничего путного не нашёл.
Спасибо.
PS. Про странную форму графика с какими-то разрывами я уж молчу.