[SOLVED] VCO
ted Wed Sep 05, 2018 1:32 pm
I am trying to make a VCO based on voltmeter and generator programs, what I need is control Overflow of the timer by voltage applied to PA7.
pwmtimer3.setOverflow(1000 - 1);
ted Wed Sep 05, 2018 1:32 pm
pwmtimer3.setOverflow(1000 - 1);
ted Thu Sep 06, 2018 3:55 pm
//http://www.stm32duino.com/viewtopic.php?f=19&t=4082
//edogaldo
#include <LiquidCrystal.h>
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);
}
ted Thu Sep 06, 2018 4:19 pm
//http://www.stm32duino.com/viewtopic.php?f=19&t=4082
//edogaldo
#include <LiquidCrystal.h>
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);
}
edogaldo Thu Sep 06, 2018 4:41 pm
ted Thu Sep 06, 2018 5:06 pm
ted Thu Sep 06, 2018 5:09 pm
[edogaldo โ Thu Sep 06, 2018 4:41 pm] โ
Try to explain the relationship you would expect between the voltage and the frequency.
smooth frequency changes
stevestrong Thu Sep 06, 2018 5:22 pm
int ovfDiv = 5050 - ain;
Timer3.pause();
Timer3.setOverflow(ovfDiv-1);
Timer3.setCompare(TIMER_CH3, ovfDiv/2);
Timer3.refresh();
Timer3.resume();
ted Thu Sep 06, 2018 5:53 pm
ted Thu Sep 06, 2018 6:07 pm
edogaldo Thu Sep 06, 2018 6:54 pm
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();
ted Thu Sep 06, 2018 9:14 pm
ted Thu Sep 06, 2018 9:24 pm
edogaldo Thu Sep 06, 2018 10:23 pm