АЦП DMA кольцевой буфер, прерывание половинка и полный, расчет среднего в прерывании.
Стабильные показания на частоте ШИМ 1000кГц, меандр, удалось получить только при 239_5 Cycles, хотя может он не успевает просчитывать.
Вот данные замеров ШИМ 10кГц
Спойлер
50%avg = 2029 - 2077
Код: Выделить всё
ADC_values[0] 4095
ADC_values[1] 4094
ADC_values[2] 4092
ADC_values[3] 4090
ADC_values[4] 4093
ADC_values[5] 1
ADC_values[6] 1
ADC_values[7] 3
ADC_values[8] 3
ADC_values[9] 2
ADC_values[10] 2
ADC_values[11] 4093
ADC_values[12] 4093
ADC_values[13] 4094
ADC_values[14] 4095
ADC_values[15] 4090
ADC_values[16] 2
ADC_values[17] 2
ADC_values[18] 2
ADC_values[19] 1
ADC_values[20] 1
ADC_values[21] 2
ADC_values[22] 4091
ADC_values[23] 4094
ADC_values[24] 4094
ADC_values[25] 4091avg = 1007 - 1031
Код: Выделить всё
ADC_values[0] 2
ADC_values[1] 0
ADC_values[2] 1
ADC_values[3] 1
ADC_values[4] 0
ADC_values[5] 2
ADC_values[6] 4092
ADC_values[7] 4091
ADC_values[8] 4091
ADC_values[9] 0
ADC_values[10] 2
ADC_values[11] 1
ADC_values[12] 1
ADC_values[13] 1
ADC_values[14] 1
ADC_values[15] 0
ADC_values[16] 1
ADC_values[17] 4095
ADC_values[18] 4092
ADC_values[19] 4091
ADC_values[20] 2
ADC_values[21] 1
ADC_values[22] 2
ADC_values[23] 1
ADC_values[24] 1
ADC_values[25] 1Усе, это идеальный вариант, стабильней некуда.
Спойлер
Код: Выделить всё
void DMA1_Channel1_IRQHandler(void)
{
static uint64_t avg;
uint16_t *dp;
uint32_t irq; uint16_t n;
DMA1->IFCR = irq = DMA1->ISR & IRQ_MASK;
dp = &ADC_values[(irq & DMA_ISR_TCIF1) ? ARRAYSIZE / 2 : 0];
n = ARRAYSIZE / 2;
avg = 0;
do {
avg += *dp;
dp += 1;
} while (--n != 0);
avg /= ARRAYSIZE / 2;
}





Напомню:


