Амплитуда генератора

Тед
Ср. 06 июня 2018 г., 18:04
Привет
Это программа для генератора синусоидации и вольтметра переменного тока, как сделать амплитуду генератора таким же, как и измеренный ?
Изменив количество - amp = 35 - я могу изменить амплитуду ручной генератора.
Я попытался использовать AMP = VOLT, но не работает, между прямыми линиями SLASH - это часть, связанная с амплитудой.
При измеренной амплитуде изменяется амплитуда генератора.
Любая помощь ?
Спасибо.
#define SAMPLES 100 #include #include // TM #include "EmonLib.h" #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); EnergyMonitor emon1, emon2, emon3; //TM float volt, avolt[50], sumv, volt2, avolt2[50], sumv2, powerFactor, apowerFactor[50], sumPF, catchPF, cur, acur[50], sumc, volt3; char symbPF = 223; dma_tube_config dma_cfg, dma_cfg2; int flag1 = 0; int out1 = PB7; int val1[SAMPLES]; int16 shift = 0; /////////////////////////////////// int amp = 35; //int amp = volt; ///////////////////////////////////// int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; dma_cfg.tube_src_size = DMA_SIZE_32BITS; dma_cfg.tube_nr_xfers = SAMPLES; dma_cfg.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC | DMA_CFG_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); } void dma_start() { dma_enable(DMA1, DMA_CH4); timer_resume(dev1); } /////////////////////////////////////////////////// void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); } } ////////////////////////////////////////////////////////// void setup() { int i; pinMode(out1, PWM); pinMode(PA7, INPUT); // U lcd.begin(16, 2); // set up the LCD’s number of columns and rows: emon1.voltage(PA6, 3000, 1.7); // Voltage: input pin, calibration, phase_shift U1 emon2.voltage(PA7, 3000, 1.7); emon1.current(PA7, 111.1); // Current Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); init_wave(); } void loop() { sumv = 0; for (int i = 0; i < 50; i++) { emon1.calcVI(20, 200); // Calculate all. No.of half wavelengths (crossings), time-out TM emon2.calcVI(20, 200); avolt[i] = emon1.Vrms; // holds volt value } for (int i = 0; i < 50; i++) { sumv += avolt[i]; } volt = sumv / 50; lcd.setCursor(0, 1); lcd.print("U="); lcd.print(volt); }

Пито
Ср. 06 июня 2018 18:55
При условии, что вы хотите генерировать точку «n» (i = 0..N-1) синусовая волна с амплитудой «Ampl» и частотой «Freq» и ​​DC смещение «DCOFF», вы должны сделать это как val1[i] = dcoff + ampl * sin((2.0 * pi * freq * i)/N);

Тед
Ср. 06 июня 2018 г., 19:50
Я хочу, чтобы генератор следовал с амплитудой приложенного сигнала к PA7 "0-3.3V » - LCD отображает, что
Выход на ШИМ на PIN PB7

Пито
Ср. 06 июня 2018 г., 21:19
float amp = analogRead(PA7); // you get 0 - 4095 for 0.0 - 3.3V on PA7 amp = amp * (3.3/4095); // amp in Volts, 3.3 is the 12bit ADC reference voltage

Тед
Ср. 06 июня 2018 г., 22:31
Это я понимаю.
Я хочу.
Когда измеренный сигнал равен 1 В, я хочу, чтобы программа изменила амплитуду генератора на 1 В, когда измерение составляет 3 В, программа сделает амплитуду генератора также 3V

ZMEMW16
Чт, 07 июня 2018 г., 7:31 утра
float volt, avolt[50], sumv, volt2, avolt2[50], sumv2, powerFactor, apowerFactor[50], sumPF, catchPF, cur, acur[50], sumc, volt3; /////////////////////////////////// int amp = 35; //int amp = volt;

Тед
Чт, 07 июня 2018 г., 15:56
Вы можете объяснить, что ?

На самом деле только эта часть используется для метра float volt, avolt[50], sumv;

Тед
Чт, 07 июня 2018 г. 15:59
Я также попробовал это - все еще не работаю val1[i] = 50 + avolt* sin(stp * i);

ZMEMW16
Чт, 07 июня 2018 г., 17:10
Он был написан как запрос / комментарий к первой попытке (прокомментировал это, так как он не сработал). Я знал, что что -то странное, забыл это.
понятия не имею, если так, но если Volt только варьирует 0.От 0 до 0.99, все, что вы получите, это 0

Google Назначение поплавка на int
Значение поплавки может быть назначено целочисленной переменной, но неявное преобразование происходит, когда компилятор заставляет значение поплавки, чтобы назначать в качестве целого числа. Цифры после десятичной записи в значении поплавки теряются после назначения поплавка на целое число.23 июля 2014 года
Любопытно, что это было моим 60 -м : D
Стивен

Тед
SAT 09 июня 2018 12:10
Вот обновленная программа, амплитуда может контролироваться кнопками на контактах PB6 и PB9.
Вольтметр отключен, цель состоит в том, чтобы; Отключить кнопки, и их функция должна быть заменена Voltmeter. Какую бы амплитуду вольтметра показана на ЖК -дисплее, u = xxx ,
Амплитуда имени должна иметь генератор.
#define SAMPLES 92 #define DEBOUNCE_DELAY 10 #define DEBOUNCE_IDLE 0 #define DEBOUNCE_ACTIVE 1 #include #include #include "EmonLib.h" #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); EnergyMonitor emon1, emon2, emon3; float volt, avolt[50], sumv; char symbPF = 223; struct debounce_info { int start, state; int16 shift; } up, down; dma_tube_config dma_cfg, dma_cfg2; int flag2 = 0; int out2 = PA8; int val1[SAMPLES]; int val2[SAMPLES]; ////////////////////////////// int ampp = PB9; int ampn = PB6; ////////////////////////////// int16 shift = 0; int amp = 35; int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; int ret = 17; timer_dev *dev2 = PIN_MAP[out2].timer_device; uint8 cc_channel2 = PIN_MAP[out2].timer_channel; void fun2() { flag2++; } void timer_conf() { timer_dma_set_base_addr(dev2, TIMER_DMA_BASE_CCR1); timer_dma_set_burst_len(dev2, 1); timer_dma_enable_req(dev2, cc_channel2); timer_set_reload(dev2, 102); timer_set_prescaler(dev2, 0); } void dma_conf() { dma_init(DMA1); /* T1C1 DMA C2 */ dma_cfg.tube_dst = &(dev2->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val2; dma_cfg.tube_src_size = DMA_SIZE_32BITS; dma_cfg.tube_nr_xfers = SAMPLES; dma_cfg.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC | DMA_CFG_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM1_CH1; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH2, &dma_cfg); } void dma_start() { dma_attach_interrupt(DMA1, DMA_CH2, fun2); dma_enable(DMA1, DMA_CH2); timer_resume(dev2); } void get_wave(int16 shift) { int i; for (i = 0; i < SAMPLES; i++) { val2[i] = 50 + amp * sin( stp * i + shift * 0.1 * 6.2831 / 360); } } void setup() { int i; pinMode(PA7, INPUT); // U pinMode(out2, PWM); pinMode(ampp, INPUT_PULLDOWN); pinMode(ampn, INPUT_PULLDOWN); memset(&up, 0, sizeof(debounce_info)); memset(&down, 0, sizeof(debounce_info)); up.shift = 1; down.shift = -1; lcd.begin(16, 2); // set up the LCD’s number of columns and rows: emon1.voltage(PA6, 3000, 1.7); // Voltage: input pin, calibration, phase_shift U1 emon2.voltage(PA7, 3000, 1.7); emon1.current(PA7, 111.1); Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); get_wave(shift); } void loop() { /* ///////////////////////////////////// sumv = 0; for (int i = 0; i < 50; i++) { emon1.calcVI(20, 200); // Calculate all. No.of half wavelengths (crossings), time-out TM emon2.calcVI(20, 200); avolt[i] = emon1.Vrms; // holds volt value } for (int i = 0; i < 50; i++) { sumv += avolt[i]; } volt = sumv / 50; lcd.setCursor(0, 1); lcd.print("U="); lcd.print(volt); ///////////////////////////////////// */ process_key_amp(digitalRead(ampp), &up); process_key_amp(digitalRead(ampn), &down); delay(100); } void process_key_amp(int val, struct debounce_info *k) { switch (k->state) { case DEBOUNCE_IDLE: if (val == HIGH) { k->state = DEBOUNCE_ACTIVE; k->start = millis(); } break; case DEBOUNCE_ACTIVE: if (val == HIGH) { if (millis() - k->start > DEBOUNCE_DELAY) { amp += (int)k->shift; get_wave(shift); } } else k->state = DEBOUNCE_IDLE; break; } }

Тед
SAT 09 июня 2018 г., 8:30 утра
Какую функцию использовать ?


Амплитуда генератора зависит от «int amp = 35;
Как изменить это, чтобы сделать это в зависимости от «ЖК -дисплеев.print (volt); "
"float amp = volt;" не работает.
Какая команда подходит для использования ?

Пито
SAT 09 июня 2018 г. 8:52 утра
"float amp = volt;" не работает. Что это значит?
Вы обрабатываете переменные «Volt» и «Amp» в нужных местах вашего источника?
Пытаться
// TED's issue with "int amp = float volt" float volt = 0.0; // or any value like 10.0, 50.0, 1000.0 .. int amp; void setup() { delay(2000); Serial.begin(); } void loop() { volt = volt + 10.0; amp = volt; float valx = 50 + amp * sin(1.5); Serial.println(valx); delay(1000); }

Тед
SAT 09 июня 2018 г. 9:30 утра
Это то, что я сделал, очевидно, не так, нет сигнала на выходе, пустой ЖК -дисплей.
Линии инвалидов вызывают ошибки.
#define SAMPLES 100 #include #include // TM #include "EmonLib.h" #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); EnergyMonitor emon1, emon2, emon3; //TM //float volt, avolt[50], sumv; char symbPF = 223; dma_tube_config dma_cfg, dma_cfg2; int flag1 = 0; int out1 = PB7; int val1[SAMPLES]; int16 shift = 0; /////////////////////////////////// //int amp = 35; //int amp = volt; //float amp = volt; ///////////////////////////////////// int cnt = 0; int time_track = 0; float stp = 6.2831 / SAMPLES; int ret = 17; timer_dev *dev1 = PIN_MAP[out1].timer_device; uint8 cc_channel1 = PIN_MAP[out1].timer_channel; void timer_conf() { timer_dma_set_base_addr(dev1, TIMER_DMA_BASE_CCR2); timer_dma_set_burst_len(dev1, 1); timer_dma_enable_req(dev1, cc_channel1); timer_set_reload(dev1, 102); timer_set_prescaler(dev1, 0); } void dma_conf() { dma_init(DMA1); /* T4C2 DMA C4 */ dma_cfg.tube_dst = &(dev1->regs.gen->DMAR); dma_cfg.tube_dst_size = DMA_SIZE_32BITS; dma_cfg.tube_src = val1; dma_cfg.tube_src_size = DMA_SIZE_32BITS; dma_cfg.tube_nr_xfers = SAMPLES; dma_cfg.tube_flags = DMA_CFG_SRC_INC | DMA_CFG_CIRC | DMA_CFG_CMPLT_IE; dma_cfg.tube_req_src = DMA_REQ_SRC_TIM4_CH2; dma_cfg.target_data = 0; ret = dma_tube_cfg(DMA1, DMA_CH4, &dma_cfg); } void dma_start() { dma_enable(DMA1, DMA_CH4); timer_resume(dev1); } /* /////////////////////////////////////////////////// void init_wave() { int i; for (i = 0; i < SAMPLES; i++) { val1[i] = 50 + amp * sin(stp * i); } } ////////////////////////////////////////////////////////// */ float volt = 0.0; // or any value like 10.0, 50.0, 1000.0 .. ///////////////////////////////////// void setup() { { delay(2000); Serial.begin(); } int i; pinMode(out1, PWM); pinMode(PA7, INPUT); // U lcd.begin(16, 2); // set up the LCD’s number of columns and rows: emon1.voltage(PA6, 3000, 1.7); // Voltage: input pin, calibration, phase_shift U1 emon2.voltage(PA7, 3000, 1.7); emon1.current(PA7, 111.1); // Current Serial.begin(9600); timer_conf(); dma_conf(); dma_start(); // init_wave(); } void loop() { volt = volt + 10.0; int amp = volt; float valx = 50.0 + amp * sin(1.5); Serial.println(valx); delay(1000); // sumv = 0; for (int i = 0; i < 50; i++) { emon1.calcVI(20, 200); // Calculate all. No.of half wavelengths (crossings), time-out TM emon2.calcVI(20, 200); // avolt[i] = emon1.Vrms; // holds volt value } for (int i = 0; i < 50; i++) { // sumv += avolt[i]; } // volt = sumv / 50; lcd.setCursor(0, 1); lcd.print("U="); lcd.print(volt); }

STM32F103C8 или ESP32 для DatalOgger