Библиотека VirtualWire и ШИМ на 9-10 pin

LoneDog
Offline
Зарегистрирован: 22.10.2013

При подключении вышеупомянутой библиотеки проподает ШИМ на 9-ом и 10-м пине. Из этого обсуждения понял что разрулить переназначением портов не получиться. Возникает устойчивое подозрение, что придется мутить програмный ШИМ на этих выходах, но я этого не умею.... может есть примеры кода?

Пример кода если что:

#include <VirtualWire.h>

int nn = 0;

void setup() {

  pinMode(10, OUTPUT); 
  pinMode(9, OUTPUT); 
  vw_set_ptt_pin(12);
  vw_set_rx_pin(7);
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(1700);	 // Bits per sec

  vw_rx_start(); 

}

void loop() {
   analogWrite(10,nn);
  analogWrite(9,nn);

  delay(1000);
  if (nn<250)
  {
    nn= nn  +10;
  }
}

 

LoneDog
Offline
Зарегистрирован: 22.10.2013

или может проще заставить virtualwire использовать timer2?

LoneDog
Offline
Зарегистрирован: 22.10.2013

Вот такой скетч получился


#include <VirtualWire.h> //- библиотека безпроводной связи
#include <SPI.h>
int REG1 = 8; //- пин, управляющий защёлкой сдвигового регистра (SS в терминах SPI)

int Moto1L = 3; //-если 1 то крутит мотор влево
int Moto1R = 2; //-если 1 то крутит мотор вправо
int Moto1Cont = 10; //- пин с ШИМ управляющий скоростью первого двигателя

int Moto2L = 5; //-если 1 то крутит мотор влево
int Moto2R = 4; //-если 1 то крутит мотор вправо
int Moto2Cont = 9; //- пин с ШИМ управляющий скоростью второго двигателя

int speed_left = 5;
int speed_right = 5;
int abs_speed_left = 0;
int abs_speed_right = 0;
int takt = 0;
int light = 0;


int currentTime = 0;       
int loopTime = 0; 
void setup()
{
  //Serial.begin(9600);	// Debugging only

  pinMode(REG1, OUTPUT);

  pinMode(Moto1L, OUTPUT);
  pinMode(Moto1R, OUTPUT);
  pinMode(Moto1Cont, OUTPUT);

  pinMode(Moto2L, OUTPUT);
  pinMode(Moto2R, OUTPUT);
  pinMode(Moto2Cont, OUTPUT);

  digitalWrite(Moto1Cont,LOW);
  digitalWrite(Moto2Cont,HIGH);

  writeShiftRegister(REG1, 0);
  // Initialise the IO and ISR
  vw_set_rx_pin(7);
  vw_set_ptt_inverted(true); // Required for DR3100
  vw_setup(1700);	 // Bits per sec

  vw_rx_start(); 


  currentTime = millis();       // считываем время, прошедшее с момента запуска программы
  loopTime = currentTime;  

}

void writeShiftRegister(int ss_pin, uint8_t value)
{
  SPI.begin();
  digitalWrite(ss_pin, LOW);
  SPI.transfer(value);
  digitalWrite(ss_pin, HIGH);
  SPI.end();
}

void loop()
{
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  if (vw_get_message(buf, &buflen)) // Non-blocking
  {
    if (buflen == 2)
    {//значит наверно это команда
      //Serial.println("command");
      uint8_t command1 = buf[0];
      uint8_t command2 = buf[1];
      if (command1/16 == 1)
      {// значит это команда устройству 1 и нам надо ее обработать
        speed_left = constrain(bitRead(command1,3)*8+bitRead(command1,2)*4+bitRead(command1,1)*2+bitRead(command1,0),1,9);
        speed_right = constrain(bitRead(command2,7)*8+bitRead(command2,6)*4+bitRead(command2,5)*2+bitRead(command2,4),1,9);      
        light = constrain(bitRead(command2,3)*2+bitRead(command2,2),0,3);
        //speed_propellers = constrain(bitRead(command2,1)*2+bitRead(command2,0),0,3);
        //управляем левым двигателем
        if (speed_left < 5)
        {
          digitalWrite(Moto1L, HIGH);
          digitalWrite(Moto1R, LOW);
          // analogWrite(Moto1Cont, map(speed_left,1,4,0,255));         
        }
        else if (speed_left > 5)
        {
          digitalWrite(Moto1L, LOW);
          digitalWrite(Moto1R, HIGH);
          // analogWrite(Moto1Cont,map(speed_left-5,4,1,0,255)); 

        }
        else if (speed_left == 5)
        {
          digitalWrite(Moto1L, LOW);
          digitalWrite(Moto1R, LOW);
          // analogWrite(Moto1Cont,0);  
        }
        //управляем правым двигателем
        if (speed_right < 5)
        {
          digitalWrite(Moto2L, HIGH);
          digitalWrite(Moto2R, LOW);
          //analogWrite(Moto2Cont, map(speed_right,1,4,0,255));   
        }
        else if (speed_right > 5)
        {
          digitalWrite(Moto2L, LOW);
          digitalWrite(Moto2R, HIGH);
          //analogWrite(Moto2Cont,map(speed_right-5,4,1,0,255)); 
        }
        else if (speed_right = 5)
        {
          digitalWrite(Moto2L, LOW);
          digitalWrite(Moto2R, LOW);
          //  analogWrite(Moto2Cont,0);  
        }
        abs_speed_left = abs(speed_left-5);
        abs_speed_right = abs(speed_right-5);
        // управляем светом
        if (light == 0)
        {
          writeShiftRegister(REG1, 0);
        }
        else if (light == 1)
        {
          writeShiftRegister(REG1, 24);
        }
        else if (light == 2)
        {
          writeShiftRegister(REG1, 126);
        }
        else if (light == 3)
        {
          writeShiftRegister(REG1, 255);
        }
      }
    }
  }

  currentTime = millis();                           // считываем время, прошедшее с момента запуска программы
  if(currentTime >= (loopTime + 12)){              // сравниваем текущий таймер с переменной loopTime + 30 милисекунд
    //digitalWrite(Moto1Cont, !digitalRead(Moto1Cont)); 
    //digitalWrite(Moto2Cont, !digitalRead(Moto2Cont));
    digitalWrite(Moto1Cont, ((abs_speed_left-takt)>0)); 
    digitalWrite(Moto2Cont, ((abs_speed_right-takt)>0));    // включаем/выключаем LED
    loopTime = currentTime;                         // в loopTime записываем новое значение
    takt = takt+1;
    if (takt > 3)
    {
      takt = 0;
    }
  }

}

Мне нужно управлять двумя моторами через драйвер l293, по этому разрядность ШИМа всего 4 и это меня устраивает, но при уменьшении времени повторения (увеличения частоты ШИМа) наблюдается странный эффект: через некоторое время 10 пин становится постоянно HIGH, а 9 LOW, вне зависимости от посылаемых команд, однако состоянием остальных выводом можно управлять, так например SPI продолжает работать и мотор на 10 пине продолжает менять направление вращения и останавливаться по команде с пульта.

Может лучше использовать для этих целей прерывание по переполнению timer2? Но этого я пока не освоил, буду читать дальше…

p.s.

не уверен в правильности использования терминов  частота и разрядность