| Ваш IP: 3.238.107.166 | Online(28) - гости: 20, боты: 8 | Загрузка сервера: 0.33 ::::::::::::

STM32 генератор импульсов (PWM) 64МГц

У микроконтроллера 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

Режим Overclocked 128 МГц

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • НЕКОТОРЫЕ ВОПРОСЫ ЭКСПЛУАТАЦИИ АККУМУЛЯТОРНЫХ БАТАРЕЙ

    При эксплуатации аккумуляторных батарей следует всегда четко помнить следующее: • после покупки батареи находятся в разряженном состоянии и перед началом эксплуатации их необходимо зарядить; • напряжение на заряженном элементе аккумуляторной батареи составляет 1,2 В; • напряжение конца разряда (напряжение, ниже которого элемент разряжать не следует) составляет 1,0…1,05 В; • емкость …Подробнее...
  • Частотомер на PIC16F628A

    Частотомер на PIC16F628A

    На рисунке показана схема простого частотомера созданного на основе микроконтроллера PIC16F628A. Частотомер измеряет частоту от 2 Гц до 10 МГц, результат измерения выводится на первую строку индикатора 1602А, во второй строке отображается период измеряемого сигнала от 100 нс до 500 мс. Время измерения 1 секунда. Сигнал уровня ТТЛ можно непосредственно …Подробнее...
  • Индикатор перегорания предохранителя

    Данное уст-во индицирует перегорание предохранителя короткими звуковыми и световыми сигналами. индикатор также может работать в цепи постоянного или переменного тока с частотой до 1000Гц и напряжением от 10 до 1000В. В качестве время задающего конденсатора служит пьезокерамический излучатель BQ1 — 0,022…0,5мкФ. Литература Радиолюбитель 2\1999 Автор: М.Шустов, А.Шустов г. ТомскПодробнее...
  • СТАЦИОНАРНЫЙ МОЩНЫЙ СВЕТОРЕГУЛЯТОР

    Сетевой полупроводниковый светорегулятор комнатного освещения со стационарной установкой вместо сетевого выключателя. Предназначен для плавного регулирования яркости свечения ламп накаливания подвесных и потолочных светильников в жилых  помещениях при максимальной мощности нагрузки 300 Вт. Надежная и устойчивая работа светорегулятора обеспечивается в течение длительного времени при эксплуатации в условиях умеренно холодного климата при …Подробнее...
  • Источник питания с фиксированным выходным напряжением 1,5…9В

    Источник питания с фиксированным выходным напряжением 1,5…9В

    При помощи стабилизатора напряжения LM317 можно сделать источник питания с фиксированным выходным напряжением — 1,5, 3, 4,5, 6 и 9В. Максимальный выходной ток источника питания 1,5А. Источник питания имеет защиту от КЗ выхода и тепловую защиту. Для стабилизатора LM317 необходим теплоотвод. В уст-ве используется трансформатор мощностью 20-25 Вт с выходным …Подробнее...