Проблема с ШИМ на atmega32

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина

Сообщение forfrends »

Всем добрый день! Делаю одно устройство на atmega32 и у меня возникли проблемы с ШИМ. На выводах OC1A, OC1B и OC2 ШИМ формируется без проблем, а вот на выводе OC0 ШИМ не регулируется. Точнее он либо в "0" либо "1" либо шим с половинной частотой (нечем промерить). На регулировку не реагирует. Пишу в среде Ардуино. Скетч:
Спойлер

Код: Выделить всё

volatile int pa = 3;   // основной выход с ШИМ
volatile int ledR = 12; // зеленый и синий светодиоды для индикации
volatile int ledG = 13; // красный светодиод для индикации
volatile int butcount = 0; // переменная для "антидребезга" кнопок
volatile int PWMledG = 100; // ШИМ-ы:
volatile int PWMledR = 125;
volatile int PWMpa = 255;
volatile int PWMledB = 0;
volatile byte mode = 0; // режим работы

void setup() {
  pinMode(pa, OUTPUT); // основной выход с ШИМ
  pinMode(ledR, OUTPUT); //Светодиоды
  pinMode(ledG, OUTPUT);
  //pinMode(ledB, OUTPUT);
  pinMode(4, INPUT); // кнопки
  pinMode(7, INPUT);
  PORTB |=(1<<PB4)|(1<<PB7); // подтягивающие резисторы
  analogWrite(pa, PWMpa); // записть начальных значений
  analogWrite(ledR, PWMledR);
  analogWrite(ledG, PWMledG);
}


void loop()
{
  switch (mode) {
      case 0:
        be_work();
        break;
      case 1:
        //be_sleep();
        break;
  }
}

void be_work()// режим работы. реакция на кнопки.
{
  if (!(PINB & (1<<PINB7))) //если кнопка нажата
  {
    if (butcount < 5)
    {
      butcount++;
    }
    else
    {
      PWMpa = PWMpa + 10;
      if (PWMpa > 255)
      {
        PWMpa=255;
      }
      analogWrite(pa, PWMpa);
      delay (200);
    }
  }
  else if (!(PINB & (1<<PINB4))) //если кнопка нажата
  {
    if (butcount < 5)
    {
      butcount++;
    }
    else
    {
      
      if (PWMpa > 10)
      {
        PWMpa = PWMpa - 10;
        analogWrite(pa, PWMpa);
        delay (200);
      }
    }
  }
  else
  {
    if (butcount > 0)
    {
      butcount--;
    }
  }
}
Если кнопками регулировать любой другой ШИМ-канал, то все без проблем, а OC0 не регулируется. Как стартанет вместе с программой так и работает. На управление нет реакции. В чем проблема? Для меги использую библиотеку ATmega32-Arduino-master. Где скачивал - не помню.
Сделать своими руками всегда интересней чем просто купить и пользоваться
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Пт сен 21, 2007 17:53:23
Откуда: Зарайск

Сообщение mrFox »

а 0й таймер как инициализируется ?
Реклама
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина

Сообщение forfrends »

Хм. Даже и не знаю. Они вроде как автоматом настраиваются самой средой. Даже и не знаю где и что смотреть. Я в них ноль...
Сделать своими руками всегда интересней чем просто купить и пользоваться
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 101
Зарегистрирован: Пт окт 03, 2014 14:50:06

Сообщение Jeka_M »

В ардуино Timer0 уже занят под millis() и micros().
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 546
Зарегистрирован: Вс дек 30, 2012 00:32:06
Откуда: Николаев / Украина

Сообщение forfrends »

добавил настройку:

TCCR0|=(1<<COM01)|(1<<WGM00);

Шим стал работать, но сбился счетчик для DELAY - но это не беда. Возникла проблема: ШИМ получается инверсным. То есть если я записываю 50, то получаю длинный высокий уровень и короткий низкий. Если записать 200 то все наоборот. не могу найти где сделать инверсию для ШИМ.

Добавлено after 12 minutes 29 seconds:
Решил проблему так:
analogWrite(pa, ~PWMpa);
Хотя, наверное, есть какой-то бит, который инвертирует ШИМ, но я его не нашел.

Добавлено after 46 seconds:
Еще вопрос: а можно ли на один и тот же таймер вешать и ШИМ и прерывание?
Сделать своими руками всегда интересней чем просто купить и пользоваться
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

forfrends писал(а):можно ли на один и тот же таймер вешать и ШИМ и прерывание?
Можно.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Возникла проблема: ШИМ получается инверсным.
Смотрите в даташите режимы ШИМ, в частности за что отвечают биты COM01:COM00
Ответить

Вернуться в «AVR»