| Ваш IP: 3.227.2.246 | Online(32) - гости: 17, боты: 15 | Загрузка сервера: 0.4 ::::::::::::


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 МГц

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

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

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

  • 10 полосный графический эквалайзер

    10 полосный графический эквалайзер

    Графический эквалайзер способен избирательно обрезать отдельные частоты акустического спектра. Таким образом мы можем адаптировать музыкальное произведение, характеристики пространства, под окружающую обстановку в которой прослушиваем музыкальное произведение.Схема должна быть на две части, то есть правый и левый канал. С помощью переключателя S1 мы включаем и выключаем эквалайзер, а с помощью регуляторов …Подробнее...
  • Метроном от 40 до 208 ударов в минуту

    Примечания: VT1 и VT2 обеспечивают линейную перестройку частоты таймера NE555 при изменении сопротивления VR1. VT1 обеспечивает мощность звучания похожую на стандартный метроном. Используйте 12В напряжение питания для получения достаточной мощности звучания метронома. Поверните ручку регулятора VR1 в направлении R2, установите R1 в положение соответствующую 40 ударам в минуту (для сравнения …Подробнее...
  • Стабилизатор напряжения 0…25,5 В с регулируемой защитой по току Открыть

    Этот стабилизатор напряжения предназначен для питания радиолюбительских конструкций в процессе их налаживания. Он вырабатывает постоянное стабилизированное напряжение от 0 до 25,5В, которое можно изменять с шагом 0,1В. Ток срабатывания защиты от перегрузки можно плавно менять от 0,2 до 2А. Схема устройства показана на рис 1, счетчики DD2 DD3 формируют цифровой …Подробнее...
  • Простой микрофонный усилитель

    Простой микрофонный усилитель

    Предложенная схема предназначена для конденсаторного микрофона. Ус-во питается от источника питания 9В (крона), сама схема может быть встроена в корпус микрофона, а громкоговоритель должен быть внешним. Схема состоит из каскада предварительного усиления на транзисторе 2N3904 и усилителя мощности на ОУ LM386. Схема проста в изготовлении, в настройке не нуждается.   Источник — http://www.eleccircuit.com/pre-mic-audio-amplifier-with-ic-lm386/Подробнее...
  • Стерео усилитель 2*5.8Вт на TA8208H

    Стерео усилитель 2*5.8Вт на TA8208H

    Микросхема TA8208H предназначена для использования в автомобильных усилителях мощности. В микросхеме имеются тепловая защита, защита от перенапряжения, защита от короткого замыкания выходов на шину питания и на корпус. Усилитель на базе TA8208H имеет следующие технические характеристики: Напряжение питания от +9 до +18В Номинальное напряжение питания 13,2В Ток покоя 80…145 мА …Подробнее...