Нужна помощь по работе таймеров

Тема в разделе "Arduino & Shields", создана пользователем kee-real, 13 апр 2014.

  1. kee-real

    kee-real Нуб

    Всем привет. Я новичек и делаю свой первый проект на Arduino Uno (AVR_ATmega328), в котором используются:
    • библиотека IR.Remote (использует timer 0),
    • библиотека AF.Motor для MotorShield с 4 выходами на моторы (наверно, использует timer 1)
    • библиотека tone.cpp (использует timer 2).
    Суть проблемы: при использовании функции tone не работают 2 выхода(1,2) на шилде с моторами. Выходы (3,4) в свою очередь исправно работают, (я предполагаю, что они используют timer 1)
    Если же функцию tone не использовать, то timer 2 освобождается и все выходы на моторчики работают исправно.
    Вопрос заключается в следующем - как побороть проблему, не отказываясь от функции tone?
     
  2. acos

    acos Официальный гик Администратор

    Нужно использовать первый таймер на всю катушку, и выставлять на нём PWM сразу для 4 ног софтварно. У меня есть примерчик для двух ног, ещё две сделаете по аналогии
    Код (Text):
    #include "TimerOne.h"

    byte pwmFreq = 0; // счетчик для PWM
    byte motorSpeed1 = 0; //Значение шим 1
    byte motorSpeed2 = 0; // шим 2

    void setup()
    {
      Timer1.initialize(4); // это можно бы и увеличить
      Timer1.attachInterrupt( timerIsr );

      pinMode(9, OUTPUT);
      pinMode(10, OUTPUT);
    }

    void loop()
    {

    for (int i=0; i<255; ++i) // выставляем значения для ШИМа
    {
      motorSpeed1=i;
      motorSpeed2=255-i;
      delay(100);
    }

    }

    void timerIsr() //Прерывание таймера. Здесь мы делаем PWM на 1-м таймере
    {
      if (motorSpeed1 < pwmFreq)
        digitalWrite(9, LOW);
      else
        digitalWrite(9, HIGH);
     
      if (motorSpeed2 < pwmFreq)
        digitalWrite(10, LOW);
      else
        digitalWrite(10, HIGH);

      ++pwmFreq;
    }