[Решено] VCO

Тед
Ср. 05 сентября 2018 г. 13:32
Привет
Я пытаюсь создать VCO на основе программ Voltmeter и Generator, мне нужно, так это управление переполнением таймера с помощью напряжения, применяемого к PA7.
pwmtimer3.setOverflow(1000 - 1);

Эдогальдо
Ср. 05 сентября 2018 г., 21:33
Вы должны поместить конфигурацию таймера в цикл, определить значение переполнения как функция входного напряжения и определить значение сравнения как половину значения переполнения.

Ура, e.

Тед
Ср. 05 сентября 2018 г., 22:27
Мне это понравилось, никаких импульсов на PB0
#include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); HardwareTimer pwmtimer3(3); int i; int volt; void setup() { pinMode(PA6, INPUT_ANALOG); lcd.begin(16, 2); pinMode(PB0, PWM); /* pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(72); // Timer input clock Prescaler = 1MHz 72MHz pwmtimer3.setOverflow(1000 - 1); pwmtimer3.setCompare(TIMER_CH3, 500); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); */ } void loop() { pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(72); // Timer input clock Prescaler = 1MHz 72MHz pwmtimer3.setOverflow(i); pwmtimer3.setCompare(TIMER_CH3, i / 2); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); i == volt; float volt = analogRead(PA6); volt = (volt * 3.3) / 4095.0; lcd.setCursor(0, 0); lcd.print(volt); delay(100); }

Rogerclark
Чт, 06 сентября 2018 г., 1:11
Я бы порекомендовал вам вернуться к основам

Я не могу вспомнить, если к нему у PB0 привязан таймер, но я бы сначала проверил это

Тогда просто на аналоговую запись на PB0 и проверьте, вы получите немного ШИМ

После работы, попробуйте настроить свой собственный ШИМ на одной частоте

Когда это работает, и вы можете установить различные начальные частоты и проверить, что работает

Затем в вашем Main () попробуйте установить начальный FREQ, ожидая 250 мс, а затем установите новый FREQ

Если на любом этапе дела не работают, как вы ожидаете, изучите, что вы делаете, и исправить ошибки

Тед
Чт, 06 сентября 2018 г. 1:53
Все работает, кроме двух последних строк, я попробовал в настройке и в цикле. Затем в вашем Main () попробуйте установить начальный FREQ, ожидая 250 мс, а затем установите новый FREQ

Если на любом этапе дела не работают, как вы ожидаете, изучите, что вы делаете, и исправить ошибки
#include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); HardwareTimer pwmtimer3(3); //int i ; void setup() { pinMode(PA6, INPUT_ANALOG); lcd.begin(16, 2); pinMode(PB0, PWM); pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(72); // Timer input clock Prescaler = 1MHz 72MHz pwmtimer3.setOverflow(1000 - 1); pwmtimer3.setCompare(TIMER_CH3, 500); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); delay(10); pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(72); // Timer input clock Prescaler = 1MHz 72MHz pwmtimer3.setOverflow(100 - 1); pwmtimer3.setCompare(TIMER_CH3, 50); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); } void loop() { /* pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(72); // Timer input clock Prescaler = 1MHz 72MHz pwmtimer3.setOverflow(1000 - 1); pwmtimer3.setCompare(TIMER_CH3, 500); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); delay(10); pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(72); // Timer input clock Prescaler = 1MHz 72MHz pwmtimer3.setOverflow(100 - 1); pwmtimer3.setCompare(TIMER_CH3, 50); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); */ /* float volt = analogRead(PA6); volt = (volt * 3.3) / 4095.0; lcd.setCursor(0, 0); lcd.print(volt); delay(100); */ }

Эдогальдо
Чт, 06 сентября 2018 г., 7:23 утра
Сказал, что вы не ждете 250 мс, а для 10, что вы видите, что вы видите?

Тед
Чт, 06 сентября 2018 г., 10:54 утра
Я положил 250 - те же результаты, на PB0 появляется только одна частота, когда я использую частоту настройки из этой линии. pwmtimer3.setOverflow(100 - 1);

Эдогальдо
Чт, 06 сентября 2018 г., 11:37
Попробуйте это: #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); HardwareTimer pwmtimer3(3); //int i ; void setup() { pinMode(PA6, INPUT_ANALOG); lcd.begin(16, 2); pinMode(PB0, PWM); } void loop() { pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(72); // Timer input clock Prescaler = 1MHz 72MHz pwmtimer3.setOverflow(1000 - 1); pwmtimer3.setCompare(TIMER_CH3, 500); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); delay(1000); pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(72); // Timer input clock Prescaler = 1MHz 72MHz pwmtimer3.setOverflow(100 - 1); pwmtimer3.setCompare(TIMER_CH3, 50); // PWM High Pulse width is 50% duty (1:1) pwmtimer3.refresh(); pwmtimer3.resume(); delay(1000); }

Стивестронг
Чт, 06 сентября 2018 г., 11:38 утра
Уже существует экземпляр Timer3 Hardwaretimer (3), определяемый в ядре, и я бы посоветовал вам использовать его, и не объявляйте новый.
Так что замените в своем коде pwmtimer3 на Timer3.

Кроме того, вам не нужно останавливаться и перезагружать таймер каждый раз, когда вы меняете значение сравнения.
Вам не нужно каждый раз устанавливать фактор Prescale.
Этого достаточно, чтобы установить его один раз в настройке //HardwareTimer pwmtimer3(3); // - not needed // in setup: Timer3.setPrescaleFactor(72); ... // in loop, when you want to change the frequency and/or duty cycle. ... Timer3.pause(); Timer3.setOverflow(TIMER_CH3, <2*value-1>); Timer3.setCompare(TIMER_CH3, ); Timer3.refresh(); Timer3.resume(); ...

Тед
Чт, 06 сентября 2018 12:32
@ Эдогальдо
Он работает, две частоты переключаются каждые 1 секунды.
мигающий светодиод = мигающий генератор. :ржу не могу:
Как это можно использовать для VCO ?

Тед
Чт, 06 сентября 2018 12:42
@ stevestrong.
Я так и сделал, и у меня есть ошибки. Ваш подход похож на мой в первом посте, вы изменили «I» на «ценность», я думаю, будет работать после удаления ошибок.
Ошибки vco_dc_-stevestrong:16: error: expected initializer before 'void' void loop() { ^ C:\Users\OWNER\Desktop\vco_dc_-stevestrong\vco_dc_-stevestrong.ino: In function 'void loop()': vco_dc_-stevestrong:23: error: 'value' was not declared in this scope value == volt; ^ vco_dc_-stevestrong:26: error: expected primary-expression before '<' token Timer3.setOverflow(TIMER_CH3, <2*value-1>); ^ vco_dc_-stevestrong:26: error: expected primary-expression before ')' token Timer3.setOverflow(TIMER_CH3, <2*value-1>); ^ vco_dc_-stevestrong:27: error: expected primary-expression before '<' token Timer3.setCompare(TIMER_CH3, ); ^ vco_dc_-stevestrong:27: error: expected primary-expression before ')' token Timer3.setCompare(TIMER_CH3, ); ^ Multiple libraries were found for "LiquidCrystal.h" Used: C:\Users\OWNER\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2018.1.3\libraries\LiquidCrystal Not used: C:\Users\OWNER\Documents\Arduino\libraries\Newliquidcrystal_1.3.5 Not used: C:\Users\OWNER\Desktop\183\arduino-1.8.3\libraries\LiquidCrystal Using library LiquidCrystal in folder: C:\Users\OWNER\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1\2018.1.3\libraries\LiquidCrystal (legacy) exit status 1 expected initializer before 'void'

Тед
Чт, 06 сентября 2018 12:44
[Стивестронг - Чт, 06 сентября 2018 г., 11:38 утра] - Как проверить полученную частоту на PB0? С применением?
Да.

Стивестронг
Чт, 06 сентября 2018 12:55
Вы забыли поставить Semicolon в конце линии с: //int i ; int value // --- missing ";" -----

Эдогальдо
Чт, 06 сентября 2018 г. 13:09
Попробуйте это: //http://www.stm32duino.com/viewtopic.php?f=19&t=4082 //edogaldo #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); int ain; int ovfDiv2; float volt; void setup() { pinMode(PA6, INPUT_ANALOG); lcd.begin(16, 2); pinMode(PB0, PWM); Timer3.setPrescaleFactor(72); } void loop() { ain = analogRead(PA6); ovfDiv2 = map(ain,0,4095,50,5000); // freq between 100Hz and 10kHz: ain=0 -> freq=100Hz - ain=4095 -> freq=10kHz Timer3.pause(); Timer3.setOverflow(2*ovfDiv2-1); Timer3.setCompare(TIMER_CH3, ovfDiv2); Timer3.refresh(); Timer3.resume(); volt = (ain * 3.3) / 4095.0; lcd.setCursor(0, 0); lcd.print(volt); delay(100); }

Тед
Чт, 06 сентября 2018 г., 13:52
Изменение частоты для входа вольтметра от 0 В до 3.3В
0 В - 1.2V = 120 Гц-30 Гц.
1.2 В - 2.7 В = Без импульсов
2.7 В - 2.8V = игрушечная музыка -на динамике
2.8 В -3.3V = 200 Гц - 40 Гц

Тед
Чт, 06 сентября 2018 г. 14:26
Я изменил эту линию. //ovfDiv2 = map(ain,0,50,4095,5000); // freq between 10KHz and 100Hz ovfDiv2 = ain; // freq between 10KHz and 100Hz

Эдогальдо
Чт, 06 сентября 2018 г. 14:31
Я изменил функцию позже: ovfDiv2 = map(ain,0,4095,50,5000); // freq between 100Hz and 10kHz: ain=0 -> freq=100Hz - ain=4095 -> freq=10kHz

Эдогальдо
Чт, 06 сентября 2018 г. 14:35
Извини: ovfDiv2 = map(ain,0,4095,5000,50); // freq between 100Hz and 10kHz: ain=0 -> freq=100Hz - ain=4095 -> freq=10kHz

Тед
Чт, 06 сентября 2018 г., 14:51
0 В- 1 В = 100 Гц, 1 В-2V = 200 Гц, 2.5V-3.3 В 400 Гц -10000 Гц.
Частота не сильно меняется для ввода от 0 В до 2.5 В

Тед
Чт, 06 сентября 2018 г. 15:17
Эдогальдо
Спасибо
Я играю с цифрами и внешним видом, я могу получить правильный ответ, однако звук не такой чистый, как использование строительства VCO на NE555.
Наверное, мне нужно усреднение "ain".

Стивестронг
Чт, 06 сентября 2018 г., 15:20
Функция отмены неверна.
Вы должны использовать это: ovfDiv2 = 5050 - map(ain,0,4095,50,5000); // freq between 100Hz and 10kHz: ain=0 -> freq=100Hz - ain=4095 -> freq=10kHz

Тед
Чт, 06 сентября 2018 г., 15:55
Я сделал усреднение, последняя цифра на ЖК -дисплее стабильна, однако это еще не влияет на качество звука. //http://www.stm32duino.com/viewtopic.php?f=19&t=4082 //edogaldo #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); int ain; int ovfDiv2; float volt; unsigned int total; // can hold max 64 readings void setup() { pinMode(PA6, INPUT_ANALOG); lcd.begin(16, 2); pinMode(PB0, PWM); Timer3.setPrescaleFactor(72); } void loop() { //////////////////// for (int x = 0; x < 64; x++) { // multiple analogue readings for averaging total = total + analogRead(PA6); // add each value to a total } volt = (total / 64.0) * 3.3; // convert readings to volt ////////////////////// ain = analogRead(PA6); //ovfDiv2 = map(ain,0,50,4095,5000); // freq between 10KHz and 100Hz //ovfDiv2 = map(ain,0,1000,10000,0); // freq between 100Hz and 10kHz: ain=0 -> freq=100Hz - ain=4095 -> freq=10kHz // ovfDiv2 = map(total,0,1000,10000,0); // ovfDiv2 = ain/5; // freq between 10KHz and 100Hz ovfDiv2 = map( total,0,50,4095,5000); // freq between 10KHz and 100Hz Timer3.pause(); Timer3.setOverflow(2*ovfDiv2-1); Timer3.setCompare(TIMER_CH3, ovfDiv2); Timer3.refresh(); Timer3.resume(); // volt = (ain * 3.3) / 4095.0; volt = (total /64.0)* 3.3 / 4095.0; lcd.setCursor(0, 0); lcd.print(volt); total = 0; // reset value delay(10); }

Тед
Чт, 06 сентября 2018 г., 16:19
Для UIN 0V -1V = 100 Гц изменение напряжения изменяет ширину импульса, а не частота, затем частота удваивается (1 В -2 В), а тот же импульс реагирует на изменения напряжения и так далее. Шаги прыжка частоты уменьшаются после 2 В. //http://www.stm32duino.com/viewtopic.php?f=19&t=4082 //edogaldo #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); int ain; int ovfDiv2; float volt; void setup() { pinMode(PA6, INPUT_ANALOG); lcd.begin(16, 2); pinMode(PB0, PWM); Timer3.setPrescaleFactor(72); } void loop() { ain = analogRead(PA6); // ovfDiv2 = map(ain,0,4095,50,5000); // freq between 100Hz and 10kHz: ain=0 -> freq=100Hz - ain=4095 -> freq=10kHz ovfDiv2 = 5050 - map(ain,0,4095,50,5000); // freq between 100Hz and 10kHz: ain=0 -> freq=100Hz - ain=4095 -> freq=10kHz Timer3.pause(); Timer3.setOverflow(2*ovfDiv2-1); Timer3.setCompare(TIMER_CH3, ovfDiv2); Timer3.refresh(); Timer3.resume(); volt = (ain * 3.3) / 4095.0; lcd.setCursor(0, 0); lcd.print(volt); delay(10); }

Эдогальдо
Чт, 06 сентября 2018 г., 16:41
Попробуйте объяснить отношения, которые вы ожидаете между напряжением и частотой.

Тед
Чт, 06 сентября 2018 г., 17:06
@stevestrong
100 Гц все время, импульсная служба плавно меняется с 50% до 0%, хороший и стабильный сигнал, теперь мне нужно изменить это, чтобы внести изменения частоты, а не ширину ?

Тед
Чт, 06 сентября 2018 г., 17:09
[Эдогальдо - Чт, 06 сентября 2018 г., 16:41] - Попробуйте объяснить отношения, которые вы ожидаете между напряжением и частотой.
плавные частоты изменения

Стивестронг
Чт, 06 сентября 2018 г., 17:22
int ovfDiv = 5050 - ain; Timer3.pause(); Timer3.setOverflow(ovfDiv-1); Timer3.setCompare(TIMER_CH3, ovfDiv/2); Timer3.refresh(); Timer3.resume();

Тед
Чт, 06 сентября 2018 г., 17:53
От 0 В до 0.5V = 10000 Гц - 800 Гц, частота меняется неплохо, от 0.5 В до 3.Частота 3 В меняется медленнее, а ширина импульса более эффективна при изменениях напряжения.

Тед
Чт, 06 сентября 2018 г., 18:07
От 0 В до 1 В меняется только ширина, после того как эта частота меняется неплохо (300 Гц-1000 Гц.)

Эдогальдо
Чт, 06 сентября 2018 г. 18:54
попробуйте это: ovfDiv2 = 500000/map(ain,0,4095,100,10000); // freq between 100Hz and 10kHz: ain=0 -> freq=100Hz - ain=4095 -> freq=10kHz Timer3.pause(); Timer3.setOverflow(2*ovfDiv2-1); Timer3.setCompare(TIMER_CH3, ovfDiv2); Timer3.refresh(); Timer3.resume();

Тед
Чт, 06 сентября 2018 г., 21:14
@ Эдогальдо
Идеально, 100 Гц-10 000 Гц, начинает отвечать @ 0.05V = очень чувствительный и точный.
@ 0.05V, первый импульс стабилен, следующие 3 импульса немного встряхивают, а 4 -й снова стабиль.
Спасибо, ребята, за помощь.

Тед
Чт, 06 сентября 2018 г., 21:24
Что это волшебное число 500 000 ?

Эдогальдо
Чт, 06 сентября 2018 г., 22:23
Вы устанавливаете часы таймера на 1 МГц, поэтому ваш период (в США) составляет 1000000/FREQ, а половина периода (50% - цикл) - (1000000/freq)/2 = 500000/freq.

72 МГц делятся на 100 кода