Переделать Ардуино на стм32

gal
Offline
Зарегистрирован: 08.06.2018
HardwareTimer pwmtimer2(2);

/////////////////////////////////////////
uint8_t sine_wave[256] = {
  0x80, 0x83, 0x86, 0x89, 0x8C, 0x90, 0x93, 0x96,
  0x99, 0x9C, 0x9F, 0xA2, 0xA5, 0xA8, 0xAB, 0xAE,
  0xB1, 0xB3, 0xB6, 0xB9, 0xBC, 0xBF, 0xC1, 0xC4,
  0xC7, 0xC9, 0xCC, 0xCE, 0xD1, 0xD3, 0xD5, 0xD8,
  0xDA, 0xDC, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE8,
  0xEA, 0xEB, 0xED, 0xEF, 0xF0, 0xF1, 0xF3, 0xF4,
  0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFA, 0xFB, 0xFC,
  0xFD, 0xFD, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF,
  0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFD,
  0xFD, 0xFC, 0xFB, 0xFA, 0xFA, 0xF9, 0xF8, 0xF6,
  0xF5, 0xF4, 0xF3, 0xF1, 0xF0, 0xEF, 0xED, 0xEB,
  0xEA, 0xE8, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDC,
  0xDA, 0xD8, 0xD5, 0xD3, 0xD1, 0xCE, 0xCC, 0xC9,
  0xC7, 0xC4, 0xC1, 0xBF, 0xBC, 0xB9, 0xB6, 0xB3,
  0xB1, 0xAE, 0xAB, 0xA8, 0xA5, 0xA2, 0x9F, 0x9C,
  0x99, 0x96, 0x93, 0x90, 0x8C, 0x89, 0x86, 0x83,
  0x80, 0x7D, 0x7A, 0x77, 0x74, 0x70, 0x6D, 0x6A,
  0x67, 0x64, 0x61, 0x5E, 0x5B, 0x58, 0x55, 0x52,
  0x4F, 0x4D, 0x4A, 0x47, 0x44, 0x41, 0x3F, 0x3C,
  0x39, 0x37, 0x34, 0x32, 0x2F, 0x2D, 0x2B, 0x28,
  0x26, 0x24, 0x22, 0x20, 0x1E, 0x1C, 0x1A, 0x18,
  0x16, 0x15, 0x13, 0x11, 0x10, 0x0F, 0x0D, 0x0C,
  0x0B, 0x0A, 0x08, 0x07, 0x06, 0x06, 0x05, 0x04,
  0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01,
  0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x03,
  0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x0A,
  0x0B, 0x0C, 0x0D, 0x0F, 0x10, 0x11, 0x13, 0x15,
  0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24,
  0x26, 0x28, 0x2B, 0x2D, 0x2F, 0x32, 0x34, 0x37,
  0x39, 0x3C, 0x3F, 0x41, 0x44, 0x47, 0x4A, 0x4D,
  0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64,
  0x67, 0x6A, 0x6D, 0x70, 0x74, 0x77, 0x7A, 0x7D
};
///////////////////////////////////////////
void setup() {
  pinMode(PA3, PWM);
  //pinMode(PB11, PWM);
  pwmtimer2.pause();
  pwmtimer2.setPrescaleFactor(1);
  pwmtimer2.setOverflow(1000 - 1);
  pwmtimer2.setCompare(TIMER_CH4, 500);
  pwmtimer2.refresh();
  pwmtimer2.resume();
}
/////////////////////////////
//ISR (TIMER1_OVF_vect)
(TIMER2_Overflow_vect)
{
  static uint8_t  n = 0;
  n = n & 511;
  sine_wave[n];
  n++;
}
/////////////////////////////
void loop() {

}
///////////////////////////////////////////////////////////////////
/*
void setup(){
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
TCCR1B = (1<<WGM13)|(1<<CS10);
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0);
TIMSK1 = 1<<TOIE1;
ICR1=511; //считать до 255
OCR1A=0; //
OCR1B=0;
}

ISR (TIMER1_OVF_vect) {
static uint8_t n=0;
OCR1A = OCR1B= sine_wave[n];
n++;
}

void loop(){
}
//pulse_width = sinetable[angle];
*/
Здравствуйте.
Помогите пожалуйста переделать оригинал ардуино на стм32.
gal
Offline
Зарегистрирован: 08.06.2018

Ниже строки # 62 оригинал.

Скважность импульсов ШИМ зависит от последнего элемента строки # 45 "500"
В место 500 надо вести модуляцию синусом.

 

nik182
Offline
Зарегистрирован: 04.05.2015

44 строка вместо 1000-1 надо 255

45 строка 128

54 строка не нужна

55 строка pwmtimer2.setCompare(TIMER_CH4, (uint16_t) sine_wave[n]);

gal
Offline
Зарегистрирован: 08.06.2018

 

Вот error

nik1_82:52: error: expected constructor, destructor, or type conversion before '{' token
 
 {
 
 ^
 
exit status 1
expected constructor, destructor, or type conversion before '{' token
52 - сообщение # 0
 

 

void setup() {
  pinMode(PA3, PWM);
  //pinMode(PB11, PWM);
  pwmtimer2.pause();
  pwmtimer2.setPrescaleFactor(1);
  pwmtimer2.setOverflow(255);
  pwmtimer2.setCompare(TIMER_CH4, 128);
  pwmtimer2.refresh();
  pwmtimer2.resume();
}
/////////////////////////////
//ISR (TIMER1_OVF_vect)
(TIMER2_Overflow_vect)
{
  static uint8_t  n = 0;
 // n = n & 511;
 pwmtimer2.setCompare(TIMER_CH4, (uint16_t) sine_wave[n]); // sine_wave[n];
  n++;
}
/////////////////////////////
void loop() {

}

 

b707
Offline
Зарегистрирован: 26.05.2017

раскомментируйте строчку 12, и закомментируйте 13-ю

gal
Offline
Зарегистрирован: 08.06.2018
строка 12 выключена = //
строка 13 включена .
Это Вы  имели в виду  ?
nik182
Offline
Зарегистрирован: 04.05.2015
gal
Offline
Зарегистрирован: 08.06.2018

Спасибо за линкс, но там программы длинные, вот сделал так, синус есть но дергается.

volatile uint8_t indx;
void Tim2_ISR(void)
{
  Timer2.setCompare(TIMER_CH4, sine_wave[indx++]);
}

void setup()
{
  indx = 0;
  pinMode(PA3, PWM);
  //pinMode(PB11, PWM);
  Timer2.pause();
  Timer2.setOverflow(256);           // maximum value of the sine wave, according to the used table
  Timer2.setCompare(TIMER_CH4, 128); // half of the maximum value, optional, overwritten by the ISR
  Timer2.refresh();
  Timer2.attachInterrupt(0, Tim2_ISR); // add this line to activate the Timer2 ISR on update event
  Timer2.resume();
}

 

b707
Offline
Зарегистрирован: 26.05.2017

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