Тед
Ср. 05 сентября 2018 г. 13:32
Привет
Я пытаюсь создать VCO на основе программ Voltmeter и Generator, мне нужно, так это управление переполнением таймера с помощью напряжения, применяемого к PA7.
Я пытаюсь создать VCO на основе программ Voltmeter и Generator, мне нужно, так это управление переполнением таймера с помощью напряжения, применяемого к PA7.
pwmtimer3.setOverflow(1000 - 1);
Эдогальдо
Ср. 05 сентября 2018 г., 21:33
Вы должны поместить конфигурацию таймера в цикл, определить значение переполнения как функция входного напряжения и определить значение сравнения как половину значения переполнения.
Ура, e.
Ура, 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
Если на любом этапе дела не работают, как вы ожидаете, изучите, что вы делаете, и исправить ошибки
Я не могу вспомнить, если к нему у 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.
Этого достаточно, чтобы установить его один раз в настройке
Так что замените в своем коде 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 ?
Он работает, две частоты переключаются каждые 1 секунды.
мигающий светодиод = мигающий генератор.
Как это можно использовать для VCO ?
Тед
Чт, 06 сентября 2018 12:42
@ stevestrong.
Я так и сделал, и у меня есть ошибки. Ваш подход похож на мой в первом посте, вы изменили «I» на «ценность», я думаю, будет работать после удаления ошибок.
Ошибки
Я так и сделал, и у меня есть ошибки. Ваш подход похож на мой в первом посте, вы изменили «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 Гц
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 В
Частота не сильно меняется для ввода от 0 В до 2.5 В
Тед
Чт, 06 сентября 2018 г. 15:17
Эдогальдо
Спасибо
Я играю с цифрами и внешним видом, я могу получить правильный ответ, однако звук не такой чистый, как использование строительства VCO на NE555.
Наверное, мне нужно усреднение "ain".
Спасибо
Я играю с цифрами и внешним видом, я могу получить правильный ответ, однако звук не такой чистый, как использование строительства 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%, хороший и стабильный сигнал, теперь мне нужно изменить это, чтобы внести изменения частоты, а не ширину ?
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 -й снова стабиль.
Спасибо, ребята, за помощь.
Идеально, 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.