4х канальный ШИМ на UNO 100ГЦ

Seni
Offline
Зарегистрирован: 23.01.2018

Необходимо 4 выхода ШИМ с частотой 100 ГЦ.

/*   Arduino UNO (Atmel 328)  */
#include <PWM.h>
//int pin5 = 5; // пины - таймер 0
//int pin6 = 6; // пины - таймер 0
int pin9 = 9; // пины - таймер 1
int pin10 = 10; // пины - таймер 1
int pin3 = 3; // пины - таймер 2
int pin11 = 11; // пины - таймер 2
unsigned long frequency = 100; // частота ШИМ  100(Гц)

void setup(){
   InitTimersSafe(); 
   SetPinFrequency(pin3, frequency); 
   SetPinFrequency(pin11, frequency);
   SetPinFrequency(pin9, frequency);  
   SetPinFrequency(pin10, frequency); 
}

void loop(){
    pwmWrite(pin9, 125);          
    pwmWrite(pin10, 125);        
    pwmWrite(pin3, 125);  
    pwmWrite(pin11, 125);
}

 

Seni
Offline
Зарегистрирован: 23.01.2018

Но в результате: на пин 11 тишина.

В чем может быть проблема.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

а 11 вывод у вас аппаратно ШИМ?? (хотя по опсанию вроде должен быть ШИМ)

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А в loop-то зачем это делать?

Перенесите строки 20-23 в setup и скажите, что получилось.

Seni
Offline
Зарегистрирован: 23.01.2018

Да, мне необходим аппаратный ШИМ. 

Seni
Offline
Зарегистрирован: 23.01.2018

ЕвгенийП пишет:

А в loop-то зачем это делать?

Перенесите строки 20-23 в setup и скажите, что получилось.

В loop я хочу менять скважность в зависимости от логики кода.

Перенес в setup, но ничего не поменялось. А именно на пине 3,9,10 частота 100 Гц, на 11 - так наводки и помехи очень малые. 11 пин жив, проверял отдельным скетчем analogWrite(11,127), частота только там дефолтовская. 

Seni
Offline
Зарегистрирован: 23.01.2018

С горем по-полам взял код(функцию) из arduino.com, 

void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x07; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}

В итоге получились такие частоты

 setPwmFrequency(3, 256);  //122 HZ
 setPwmFrequency(11, 256);  // 122 HZ
 setPwmFrequency(9, 256);   // 122 HZ 
 setPwmFrequency(10, 256);   //  122 HZ

 //setPwmFrequency(3, 512);   // 490 HZ
 //setPwmFrequency(11, 512);  // 490 HZ
 //setPwmFrequency(9, 512);   // 490 HZ 
 //setPwmFrequency(10, 512);  // 490 HZ

 //setPwmFrequency(3, 1024);   // 31 HZ
 //setPwmFrequency(11, 1024);  // 31 HZ
 //setPwmFrequency(9, 1024);   // 31 HZ 
 //setPwmFrequency(10, 1024);  // 31 HZ

ШИМ 100 Гц на все четырех пинах arduino UNO пока не получается. Пока только 122 Гц (