| Ваш IP: 3.236.96.157 | Online(36) - гости: 23, боты: 12 | Загрузка сервера: 1.48 ::::::::::::

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

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

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

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

  • Стабилизатор лабораторного источника питания

    Стабилизатор собран на микросхеме КР142ЕН2А и внешним регулирующим транзистором. Схема обеспечивает при входном напряжении 40В выходное регулируемое напряжение от 3 до 33В при токе нагрузки до 0,5А. Так же имеется защита от КЗ. Литература — Радиоконструктор 2000-10Подробнее...
  • ПРИСТАВКА-АВТОМАТ К ЗАРЯДНОМУ УСТРОЙСТВУ

    Дополнив   имеющееся  в  вашем  распоряжении  зарядное  устройство  для автомобильной  аккумуляторной  батареи  предлагаемым  автоматом, можете быть спокойны  за  режим  зарядки  батареи  — как только напряжение на ее выводах достигнет  (14,5+-0,2)В,  зарядка  прекратится.  При  снижении напряжения до 12,8…13 В зарядка возобновится. Приставка  может быть выполнена в виде отдельного блока либо встроена в …Подробнее...
  • АЦП-модуль ADS1115 (Arduino)

    АЦП-модуль ADS1115 (Arduino)

    АЦП-модуль ADS1115 представляет собой 16-битный  аналого-цифровой преобразователь, который имеет 4 входа для преобразования аналоговый сигнал в цифровой. АЦП-модуль ADS1115 основан на одноименном чипе и содержит все необходимые для его работы внешние компоненты. АЦП-модуль совместим с I2C шиной. Оснащен программируемым усилителем и цифровым компаратором. Выполняет преобразования со скоростью передачи данных от 8 до …Подробнее...
  • Видео-разветвитель

    Это устройство полностью исключает взаимное влияние устройств принимающих сигнал от видео-разветвителя, в добавок это уст-во можно расширить до любого числа выходов. В основе видео-разветвителя специализированная микросхема ВА7604N. Каждая микросхема содержит 2-а усилителя расчитанные на 75-и омную нагрузку. Коэффициент усиления таких усилителей 1. Номинальное входное напряжение входного и выходного видеосигнала 1В …Подробнее...
  • Автомат световых эффектов

    Автомат световых эффектов создает картину бегущего огня или бегущей тени (при переключении SA1). R1 позволяет менять частоту генератора прямоугольных импульсов (К155Ла3). Триггеры DD2 (К155ТМ2) соединенные последовательно образуют двоичный счетчик импульсов поступающих на его вход от генератора на DD1. В итоге частота на выходе первого триггера вдвое меньше, а на выходе …Подробнее...