1

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

Здравствуйте
А как добавить еепром  чтобы после выключения и включения частота была такой как до выключения ?

Моя попытка не работает.

//http://rcl-radio.ru/?p=68958
#include <Wire.h> 
HardwareTimer pwmtimer4(4);
#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
#include <EEPROM.h>
 
long int del=1,mn=1,pg=0, f_g=2, imp = 1, hhh = 0;
float f;
 
void setup() {

   lcd.begin(16, 2);
   
pinMode(PB0, PWM);  // имп. выход
  pinMode(PB7, PWM);
  pinMode(PB14,INPUT_PULLDOWN); // +
  pinMode(PB12,INPUT_PULLDOWN);// -
  pinMode(PB11,INPUT_PULLDOWN);// х1 х10 x100 x1000
  pinMode(PB13,INPUT_PULLDOWN); // PG / PWM

  pinMode(PB7, PWM); //Tx
   
  pwmtimer4.pause();
  pwmtimer4.setPrescaleFactor(del);      
   pwmtimer4.setOverflow(f_g-1);// /2  
  pwmtimer4.setCompare(TIMER_CH2, imp);// меандр
  pwmtimer4.refresh();
  pwmtimer4.resume();
 
  EEPROM.read(500, (uint16*)&f);
}
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(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);}
    if(digitalRead(PB12)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer4.setPrescaleFactor(del);}

  lcd.setCursor(0, 0);lcd.print("F = ");
 
  f = 64000000/(1*del);


   pwmtimer4.setOverflow(f_g-1);// /2         
   pwmtimer4.setCompare(TIMER_CH2, 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(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);}
    if(digitalRead(PB12)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer4.setPrescaleFactor(del);}
    }
    if(hhh==1){
    if(digitalRead(PB14)==HIGH){imp++;if(imp>100){imp=100;}}
    if(digitalRead(PB12)==HIGH){imp--;if(imp<0){imp=0;}}
    }
 
    pwmtimer4.setOverflow(f_g-1);// /2         
    pwmtimer4.setCompare(TIMER_CH2, 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);
   EEPROM.write(500, f);
}

2

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

В stm32 нет EEPROM, ее надо создать в памяти для программы:

в setup добавьте:

EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte

Ячейка памяти 16 бит

Запоминать нужно del, mn, f_g,  imp

3

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

Получилось для mn остальные не знаю как.

//http://rcl-radio.ru/?p=68958
#include <Wire.h> 
HardwareTimer pwmtimer4(4);
#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
#include <EEPROM.h>
 
long int del=1,mn=1,pg=0, f_g=2, imp = 1, hhh = 0;
float f;
 
void setup() {

   lcd.begin(16, 2);
   
  pinMode(PB0, PWM);  // имп. выход
  pinMode(PB7, PWM);
  pinMode(PB14,INPUT_PULLDOWN); // +
  pinMode(PB12,INPUT_PULLDOWN);// -
  pinMode(PB11,INPUT_PULLDOWN);// х1 х10 x100 x1000
  pinMode(PB13,INPUT_PULLDOWN); // PG / PWM

  pinMode(PB7, PWM); //Tx
   
  pwmtimer4.pause();
  pwmtimer4.setPrescaleFactor(del);      
  pwmtimer4.setOverflow(f_g-1);// /2  
  pwmtimer4.setCompare(TIMER_CH2, imp);// меандр
  pwmtimer4.refresh();
  pwmtimer4.resume();
 EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte --------------------------------------
  
  // Запоминать нужно del, mn, f_g,  imp
   //EEPROM.read(500,(uint16*)del);
   EEPROM.read(500, (uint16*)&mn);
   //EEPROM.read(500, (uint16*)f);
   //EEPROM.read(500,(uint16*) mg);
  //EEPROM.read(500, (uint16*)imp);
  //--------------------------------------------------------------------------------------
}
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(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);}
    if(digitalRead(PB12)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer4.setPrescaleFactor(del);}

  lcd.setCursor(0, 0);lcd.print("F = ");
 
  f = 64000000/(1*del);


   pwmtimer4.setOverflow(f_g-1);// /2         
   pwmtimer4.setCompare(TIMER_CH2, 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(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);}
    if(digitalRead(PB12)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer4.setPrescaleFactor(del);}
    }
    if(hhh==1){
    if(digitalRead(PB14)==HIGH){imp++;if(imp>100){imp=100;}}
    if(digitalRead(PB12)==HIGH){imp--;if(imp<0){imp=0;}}
    }
 
    pwmtimer4.setOverflow(f_g-1);// /2         
    pwmtimer4.setCompare(TIMER_CH2, 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);
// Запоминать нужно del, mn, f_g,  imp

  //EEPROM.write(500,del);
   EEPROM.write(500, mn);
   //EEPROM.write(500, f);
   //EEPROM.write(500, mg);
   //EEPROM.write(500, imp);
}

4

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

Это уберите: 
//EEPROM.write(500,del);
   EEPROM.write(500, mn);
   //EEPROM.write(500, f);
   //EEPROM.write(500, mg);
   //EEPROM.write(500, imp);

Сохранять значение нужно в момент когда Вы его изменяете:

if(digitalRead(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);}

if(digitalRead(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);EEPROM.write(0, del);}

/////////////////////////////////

void setup() {
   EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte --------------------------------------
   EEPROM.read(0,del);

   lcd.begin(16, 2);
   
  pinMode(PB0, PWM);  // имп. выход
  pinMode(PB7, PWM);
  pinMode(PB14,INPUT_PULLDOWN); // +
  pinMode(PB12,INPUT_PULLDOWN);// -
  pinMode(PB11,INPUT_PULLDOWN);// х1 х10 x100 x1000
  pinMode(PB13,INPUT_PULLDOWN); // PG / PWM

  pinMode(PB7, PWM); //Tx
   
  pwmtimer4.pause();
  pwmtimer4.setPrescaleFactor(del);     
  pwmtimer4.setOverflow(f_g-1);// /2 
  pwmtimer4.setCompare(TIMER_CH2, imp);// меандр
  pwmtimer4.refresh();
  pwmtimer4.resume();
}

5

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

Спасибо
Поменял
  // EEPROM.read(0,del); = ошибка = invalid conversion from 'long int' to 'uint16* {aka short unsigned int*}' [-fpermissive]

на
   EEPROM.read(0, (uint16*)&del);
и  работает как надо.

6 (2021-03-17 08:58:55 отредактировано galina)

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

сегодня пробовал генератор, но получилось что показания на LCD не совпадают с частотой.
LCD показывает 5 kHz но измерене показывает 2.82 kHz 


//http://rcl-radio.ru/?p=68958
//http://forum.rcl-radio.ru/viewtopic.php?pid=3177#p3177
#include <Wire.h> 
HardwareTimer pwmtimer4(4);
#include <LiquidCrystal.h>
LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5);
//LiquidCrystal lcd(PA9, PB15, PA2, PA10, PB8, PB9);// BIALE CYFRY, new pins
#include <EEPROM.h>
 
long int del=1,mn=1,pg=0, f_g=2, imp = 1, hhh = 0;
float f;
 
void setup() {
  // Запоминать нужно del, mn, f_g,  imp
  EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte --------------------------------------
  // EEPROM.read(0,del);
   EEPROM.read(0, (uint16*)&del);
   
   lcd.begin(16, 2);
   
  pinMode(PB0, PWM);  // имп. выход
  pinMode(PB7, PWM);
  pinMode(PB14,INPUT_PULLDOWN); // +
  pinMode(PB12,INPUT_PULLDOWN);// -
  pinMode(PB11,INPUT_PULLDOWN);// х1 х10 x100 x1000
  pinMode(PB13,INPUT_PULLDOWN); // PG / PWM

  pinMode(PB7, PWM); //Tx
   
  pwmtimer4.pause();
  pwmtimer4.setPrescaleFactor(del);      
  pwmtimer4.setOverflow(f_g-1);// /2  
  pwmtimer4.setCompare(TIMER_CH2, imp);// меандр
  pwmtimer4.refresh();
  pwmtimer4.resume();

}
void loop() {
  
    if(digitalRead(PB13)==HIGH&&pg==0){pg=1;f_g=100, imp = 50;lcd.clear();delay(300);}
    if(digitalRead(PB13)==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(PB11)==HIGH){mn=mn*10;if(mn>1000){mn=1;EEPROM.write(500, mn);}}
    
    //if(digitalRead(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);}
    if(digitalRead(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);EEPROM.write(0, del);}

    
   // if(digitalRead(PB12)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer4.setPrescaleFactor(del);}
     if(digitalRead(PB12)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer4.setPrescaleFactor(del);EEPROM.write(0, del);}
    

  lcd.setCursor(0, 0);lcd.print("F = ");
 
  f = 64000000/(1*del);


   pwmtimer4.setOverflow(f_g-1);// /2         
   pwmtimer4.setCompare(TIMER_CH2, 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(PB14)==HIGH){del=del+mn;if(del>65535){del=65535;}pwmtimer4.setPrescaleFactor(del);}
    if(digitalRead(PB12)==HIGH){del=del-mn;if(del<1){del=1;}pwmtimer4.setPrescaleFactor(del);}
    }
    if(hhh==1){
    if(digitalRead(PB14)==HIGH){imp++;if(imp>100){imp=100;}}
    if(digitalRead(PB12)==HIGH){imp--;if(imp<0){imp=0;}}
    }
 
    pwmtimer4.setOverflow(f_g-1);// /2         
    pwmtimer4.setCompare(TIMER_CH2, 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);


}

7

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

Ошибку нашел, забыл переключить на - overclocked 128MHz.
Возможно в  этой программе добавить регулировку скважности импульсов ?

8

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

Возможно в  этой программе добавить регулировку скважности импульсов ?

Не это невозможно, только меандр.

9

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

А добавить второй канал с регулировкой фазы по отношению к первому каналу ?