У микроконтроллера STM32F103C8T6 достаточно высокая рабочая частота, номинальная 72 МГц, а в режиме Overclocked 128 МГц, благодаря этому STM32 можно использовать как импульсный генератор (меандр) с максимальной частотой 64 МГц, а в режиме ШИМ генератора с максимальной частотой 1.28 МГц и процентом коэффициента заполнения от 0 до 100.
Конечно на таком генераторе нельзя получить любую частоту от 0 до 64 МГц, частота меняется дискретно и зависит от делителя таймера, например при делителе 1 на выходе генератора будет частота равная 64 МГц, при делителе 2 32 МГц, при 3 21.333 МГц, при 4 16 МГц и так далее.
Минимальное значение делителя 1 (f = 64 МГц), максимальное 65535 (f = 1 кГц). Для удобства изменения частоты сделан множитель делителя х1 х10 х100 х1000, которой можно менять в процессе установки частоты.
Для управления работой генератора используются 4-е кнопки:
- Выбор работы режима генератора — меандр / ШИМ
- Выбор множителя делителя
- Увеличение делителя
- Уменьшения делителя
Как отмечалось ранее генератор может работать в режиме генерации ШИМ, для изменения коэффициента заполнения необходимо несколько раз нажать кнопку множителя делителя до появления знака «%» и кнопками «увеличение делителя» и «уменьшение делителя» установить нужный процент коэффициента заполнения.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // liquidcrystali2c.zip LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей HardwareTimer pwmtimer3(3); long int del=1,mn=1,pg=0, f_g=2, imp = 1, hhh = 0; float f; void setup() { lcd.init(); lcd.backlight();// Включаем подсветку дисплея /////////////////////////// pinMode(PB0, PWM); // имп. выход pinMode(PB1,INPUT); // + pinMode(PB10,INPUT);// - pinMode(PB11,INPUT);// х1 х10 x100 x1000 pinMode(PB5,INPUT); // PG / PWM pwmtimer3.pause(); pwmtimer3.setPrescaleFactor(del); pwmtimer3.setOverflow(f_g-1);// /2 pwmtimer3.setCompare(TIMER_CH3, imp);// меандр pwmtimer3.refresh(); pwmtimer3.resume(); } void loop() { if(digitalRead(PB5)==HIGH&&pg==0){pg=1;f_g=100, imp = 50;lcd.clear();delay(300);} if(digitalRead(PB5)==HIGH&&pg==1){pg=0;f_g=2;imp = 1;lcd.clear();delay(300);} ///////////////////////////////////////////////////////// if(pg==0){ if(digitalRead(PB11)==HIGH){mn=mn*10;if(mn>1000){mn=1;}} if(digitalRead(PB1)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer3.setPrescaleFactor(del);} if(digitalRead(PB10)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer3.setPrescaleFactor(del);} lcd.setCursor(0, 0);lcd.print("F = "); f = 64000000/(1*del); pwmtimer3.setOverflow(f_g-1);// /2 pwmtimer3.setCompare(TIMER_CH3, imp);// меандр if(f>1000000){lcd.print(f/1000000,3);lcd.print(" MHz ");}else{lcd.print(f/1000,3);lcd.print(" kHz ");} lcd.setCursor(0,1); lcd.print("x");lcd.print(mn);lcd.print(" ");lcd.setCursor(6,1);lcd.print("d");lcd.print(del);lcd.print(" ");lcd.setCursor(13,1);lcd.print("PG "); } // pg = 0 /////////////////////////////////////////////////////////// if(pg==1){ lcd.setCursor(0, 0); lcd.print("F = ");f = 64000000/(1*del)/50; if(digitalRead(PB11)==HIGH&&hhh==0){mn=mn*10;if(mn>1000){mn=1;hhh=1;}delay(300);} if(digitalRead(PB11)==HIGH&&hhh==1){mn=1;hhh=0;delay(300);} if(hhh==0){ if(digitalRead(PB1)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer3.setPrescaleFactor(del);} if(digitalRead(PB10)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer3.setPrescaleFactor(del);} } if(hhh==1){ if(digitalRead(PB1)==HIGH){imp++;if(imp>100){imp=100;}} if(digitalRead(PB10)==HIGH){imp--;if(imp<0){imp=0;}} } pwmtimer3.setOverflow(f_g-1);// /2 pwmtimer3.setCompare(TIMER_CH3, imp);// ШИМ if(f>1000000){lcd.print(f/1000000,3);lcd.print(" MHz ");}else{lcd.print(f/1000,3);lcd.print(" kHz ");} lcd.setCursor(0,1); if(hhh==0){lcd.print("x");lcd.print(mn);} if(hhh==1){lcd.print("%");lcd.print(imp);} lcd.print(" ");lcd.setCursor(6,1);lcd.print("d");lcd.print(del);lcd.print(" ");lcd.setCursor(13,1);lcd.print("PWM"); } delay(300); }
Перед заливкой скетча в STM32 Вам необходимо ознакомиться со следующей статьей — STM32 Arduino IDE