Пт апр 09, 2021 20:12:31
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] 4091
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;
}
Пт апр 09, 2021 20:21:49
Пт апр 09, 2021 20:48:52
620
616
615
616
616
616
615
613
616
615
616
615
619
617
609
616
616
615
614
615
613
615
617
616
613
616
615
613
615
617
616
615
Сб апр 10, 2021 18:32:57
volatile uint32_t avg_s;
volatile uint32_t rms_s;
#define ARRAYSIZE 1024UL
uint16_t ADC_values[ARRAYSIZE] __attribute__ ((aligned(4)));
#define dsp_count 700UL
void DMA1_Channel1_IRQHandler(void)
{
static uint32_t avg;
static uint64_t rms;
static uint64_t avg_t;
static uint64_t rms_t;
static uint16_t count=0;
uint32_t temp;
uint16_t *dp;
uint32_t irq; uint16_t n;
DMA1->IFCR = irq = DMA1->ISR & DDS_IRQ_MASK;
dp = &ADC_values[(irq & DMA_ISR_TCIF1) ? ARRAYSIZE / 2 : 0];
n = ARRAYSIZE / 2;
avg = 0; rms=0;
do {
avg += *dp & 0xFFF8;
temp = *dp & 0xFFF8;
rms += (temp) * (temp);
dp += 1;
} while (--n != 0);
avg_t += avg;
rms_t += rms;
if(count++ == dsp_count) {
avg_t /= ((ARRAYSIZE * dsp_count) / 2);
rms_t /= ((ARRAYSIZE * dsp_count) / 2);
rms_t = isqrt64(rms_t);
avg_s = avg_t;
rms_s = rms_t;
count=0; avg_t=0; rms_t=0;
}
}
Сб апр 10, 2021 22:11:04
Сб апр 10, 2021 22:27:02
Вс апр 11, 2021 06:50:34
Нет, пробовать я не буду, нет смысла.Andrey_B писал(а):Попробуйте:
Вот когда он, стм, начинает прыгать между каналами - вот и возникает тот случай, который вы указали по ссылке.Andrey_B писал(а):Делайте второй канал измерения тока.
Для этого есть готовые электросчетчики, в которых установлены аппаратные специализированные чипы, а не какая-то программная хрень.Andrey_B писал(а):то измеритель мощности легко посчитает активную и реактивную мощности, коэффициент мощности, энергию и т.д.
Ни когда hex от другого чипа не будет равен вашему.linkov1959 писал(а): Если выложишь hex, то можно сравнить.
Вс апр 11, 2021 09:52:31
Dimon456 писал(а):Если и делать второй канал, то только на тех стм, на которых есть второй реальный ацп.
Dimon456 писал(а):Для этого есть готовые электросчетчики, в которых установлены аппаратные специализированные чипы, а не какая-то программная хрень.
Вс апр 11, 2021 10:36:57
Andrey_B писал(а):F030
// Внешний кварцевый HSE генератор
void Overclocking(void) // Разгон микроконтроллера.
{
FLASH->ACR|= FLASH_ACR_PRFTBE; //Включить буфер предварительной выборки
FLASH->ACR&= ~FLASH_ACR_LATENCY; //Очистить FLASH_ACR_LATENCY
FLASH->ACR |= FLASH_ACR_LATENCY; //Пропускать 1 такт
RCC_HSEConfig(RCC_HSE_ON); // Включаем HSE генератор.
while(!(RCC->CR & RCC_CR_HSERDY)); //ожидание готовности HSE
RCC->CFGR2 = RCC_CFGR2_PREDIV1_DIV1; // предделитель для PLL RCC_CFGR2_PREDIV1_DIV1-8MHz
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE); // Выбираем источником такторования HSE генератор.
RCC_PLLCmd(DISABLE); // Выключаем умножитель частоты.
RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_CFGR_PLLMULL9); // 9*8MHz=72MHz На сколько будем умножать частоту. RCC_CFGR_PLLMULL6 - 48MHz
RCC_PLLCmd(ENABLE); // Включаем умножитель частоты.
while ((RCC->CR & RCC_CR_PLLRDY) == 0); // Ждем запуска умножителя частоты.
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Выбираем источником такторования умножитель частоты.
SystemCoreClockUpdate(); // Вычисление тактовой частоты ядра.
}
void Overclocking(void) // Разгон микроконтроллера.
{
FLASH->ACR|= FLASH_ACR_PRFTBE; //Включить буфер предварительной выборки
FLASH->ACR&= ~FLASH_ACR_LATENCY; //Очистить FLASH_ACR_LATENCY
FLASH->ACR |= FLASH_ACR_LATENCY; //Пропускать 1 такт
RCC_HSICmd(ENABLE); // Включаем внутренний RC генератор.
while(!(RCC->CR & RCC_CR_HSIRDY)); //ожидание готовности HSI
RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI); // Выбираем источником такторования внутренний RC генератор.
RCC_PLLCmd(DISABLE); // Выключаем умножитель частоты.
// RCC_CFGR_PLLMULL2-8MGz 4-16MGz 6-24MGz 8-32MGz 12-48MGz
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_CFGR_PLLMULL12); // На сколько будем умножать частоту.
RCC_PLLCmd(ENABLE); // Включаем умножитель частоты.
while ((RCC->CR & RCC_CR_PLLRDY) == 0); // Ждем запуска умножителя частоты.
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Выбираем источником такторования умножитель частоты.
SystemCoreClockUpdate(); // Вычисление тактовой частоты ядра.
}
пока не могу ответить на этот вопрос.Andrey_B писал(а):однако смысл делать опыты с МК вы нашли
Вс апр 11, 2021 11:05:32
Вс апр 11, 2021 20:07:40
Проблема в том что оцифровка сигнала идет постоянна, когда же ему просыпаться?Andrey_B писал(а):Хотите уменьшить шум, усыпляйте МК на время оцифровки,
вот тут уже интересней будет. Опускаем вывод AREF (или как он там правильно? VDDA) на источник опорного напряжения 2.048В что на выходе АЦП ровно даст значение в миллиВ, останется сдвинуть только на единицу в право.Andrey_B писал(а):причем не к разрядности АЦП, она вам не нужна, а к реальным вольтам на входе с учетом делителя.
для того и кочегарю мк, что бы иметь возможность все расчеты выполнить в прерывании.Andrey_B писал(а): Не надо извлекать корень в прерывании,
Это будет сложно сделать. При Тактовой АЦП 14МГц и 7_5Cycles формула (12,5+7,5)/14=1,43мкс.Andrey_B писал(а):Подберите период измерения кратным 20мс, для подавления неизбежных сетевых 50Гц.
Связующим звеном у них МК, мне больше попадались с Атмегой и Атюни, а вот для измерения как раз используются специализированные чипы. А также и со встроенной антенной на каком нибудь rf-модуле, встроенная spi-флешка на разъеме, часы реального времени, а еще блютуз и фай-фай. И за все это я должен заплатить. Еще и многотарифность.Andrey_B писал(а):а вот многофункциональные счетчики с возможностью измерения кучи параметров, как правило, делают на МК.
Вс апр 11, 2021 21:49:13
Вс апр 11, 2021 22:11:09
Andrey_B писал(а):изыскивайте возможности
Andrey_B писал(а): Не пытайтесь выбрать
Мне это не надо. Я за этот код больше не возьмусь.Andrey_B писал(а):передавайте
Не думаю, при питании от батареи все нормально будет. И про какие шумы идет речь? Если не прыгать по каналам - то все ок.Andrey_B писал(а):Опускать опору не стоит, сильно проиграете на шумах.
Да не уложитесь вы ни когда в этот интервал, без синхронизации, для этого нужен какой нибудь сверх точный кварц с х.0000000001 в каком-то разряде.Andrey_B писал(а):уложиться в интервал, кратный 20мс.
Andrey_B писал(а): Делить ведь в прерывании не надо
Что вам мешает его в прерывании выполнять? Не пойму. 64битное число из прерывания вытаскивать против 32битного числа.Andrey_B писал(а):Квадратный корень в основном теле
Для чего? За 0,5сек эта штука выполняет 358400 измерений, вы потом из всего этого среднее находите или квадратное.Andrey_B писал(а):применение фильтра скользящего среднего
Вс апр 11, 2021 23:10:33
Пн апр 12, 2021 07:24:15
Пн апр 12, 2021 09:12:12
Пн апр 12, 2021 21:46:50
Вт апр 13, 2021 11:08:23
Dimon456 писал(а):, сегодня ни как, завтра то же ни как, может после завтра.
...
Добавлено after 8 hours 21 minute 11 seconds:
Собрал я этот х. стенд.
...
Какие будут выводы, я у вас спрашиваю, у всех спрашиваю?
Вт апр 13, 2021 15:45:18
от величины опоры зависит целочисленное деление.Andrey_B писал(а):от величины опоры
1. RESULT = ((ADCA*3300)/4096);
2. RESULT = ((ADCA*2048)/4096);
Не вы ли мне давали ссылку на какой-то сайт?Andrey_B писал(а):Если правильно сформировать сигнал для АЦП, переключение каналов ни как не сказывается на точности.
Надо бы это проверить, разгоним до 72МГц, и выдадим ШИМ 4Гц, получаетсяAndrey_B писал(а):Типичный кварц ABM3-8.000MHZ
Timer Prescaler :287; Preload = 62499; Actual Interrupt Time = 250 ms
avg_t /= ((ARRAYSIZE * dsp_count) / 2);
вы что, не смотрели мой код?Andrey_B писал(а):тогда и синхронизация не нужна будет
Вт апр 13, 2021 16:35:07
Dimon456 писал(а):от величины опоры зависит целочисленное деление.
Как думаете на сколько будет выигрыш?
- Код:
1. RESULT = ((ADCA*3300)/4096);
2. RESULT = ((ADCA*2048)/4096);
Dimon456 писал(а):Не вы ли мне давали ссылку на какой-то сайт?
Dimon456 писал(а):, это может привести к непредсказуемым значениям.
Dimon456 писал(а):Тем более, как я уже писал, ваши 50Гц остаются в розетке, дальше пошли импульсные источники питания и частотные преобразователи, а там далеко уже не 50Гц, и нет ни какого смысла гнаться к этому периоду.