AVR Урок 13. ШИМ. Мигаем светодиодом плавно. Часть 2



Урок 13

Часть 2

ШИМ. Мигаем светодиодом плавно

 

Продолжаем работать с функцией, отвечающей за работу с ШИМ.

Дальше заносим 0 в регистр счёта TCNT2, то есть обнуляем счётчик

 

TCCR2=0b01101110; //Fast PWM, Clear OC2 on Compare Match, clkT2S/256 (From prescaler) (реальная частота получится 8мгц/256 = 31250 гц)

TCNT2=0x00; // Timer Value = 0

 

Далее проинициализируем регистр OCR2, который как раз и задаёт значение скважности. Пока зададим ноль, а в основном коде уже будем задавать другие нужные нам значения. То есть при нуле практически импульсов у нас не будет вообще

 

TCNT2=0x00; // Timer Value = 0

OCR2=0x00; //Output Compare Register = 0 — в нашем случае это скважность шим (0 — это 0, а FF — 100 %)

 

Регистр TIMSK также символически не трогаем, сложив его по «ИЛИ» с нулём, что вообще ни к чему не приводит, просто мы демонстративно покажем, что мы его не трогаем

 

  OCR2=0x00; //Output Compare Register = 0 — в нашем случае это скважность шим (0 — это 0, а FF — 100 %)

  TIMSK|=0x00;

}

 

Перейдём в главный модуль Test10.c и в функции main() установим какую-нибудь скважность, например 50

 

init_PWM_timer();

OCR2 = 0;

 

Ну конечно же это будет не 50 процентов, 50/255*100, что составит приблизительно 19,6 процентов. 

Соберём код.

 

 

Для протеуса скопируем и один из первых проектов и подключим через токоограничивающий резистор светодиод к ножке 19, через которую мы и управляем ШИМом. Также подключим измерительный прибор вот здесь

 

image05

 

и подключим его к той же ножке

 

image06

 

Запустим проект в протеусе и получим вот такую картину

 

image07

 

 

 

Теперь давайте попробуем сочинить код в бесконечный, который будет управлять плавно скважностью от 0 до 100 процентов, ну а, соответственно OCR2 мы будем менять от 0 до 255. Я думаю, используя знания прошлых занятий, нам уже будет это сделать очень несложно. Сначала добавим переменную для статуса нашего ШИМ. Будет 2 вида статуса — нисходящий и восходящий — 0 и 1. 

 

int main(void)

{

  unsigned char pwm_state=0;

  port_ini();

 

Ну, а теперь, собственно, цикл

 

while(1)

{

  if (pwm_state==0)

  {

    OCR2++;

    if (OCR2>254)

    {

      pwm_state=1;

    }

  }

  if (pwm_state==1)

  {

    OCR2—;

    if (OCR2<1)

    {

      pwm_state=0;

    }

  }

  _delay_ms(3);

}

 

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

Соберем код и попробуем пока посмотреть в протеусе, как будет меняться скважность. В рамках текстовой версии занятия мы данного эффекта не увидим, поэтому в этом случае лучше посмотреть видеоурок, так как осцилограмма ведёт себя очень красиво.

Теперь попробуем подключить контроллер со светодиодом вот таким вот образом

 

image09

 

 и прошьём контроллер. Приблизительно такой будет эффект

 

image08

 

Лучший эффект конечно виден именно в видеоверсии.

 

 

Предыдущая часть Программирование МК AVR Следующий урок

 

Исходный код

 

Купить программатор можно здесь (продавец надёжный) USBASP USBISP 2.0

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR ШИМ. Мигаем светодиодом плавно

12 комментариев на “AVR Урок 13. ШИМ. Мигаем светодиодом плавно. Часть 2
  1. Riverman:

    Появились два вопроса, если можно, разъясните:

    1. Возможно ли увеличение периода увеличения скважности, то есть чтобы наш светодиод разгорался минуты 3. Число градаций OCR2 ограничивается 0xFF, т.е. 255. Чем же растянуть время разгорания?

    2. Сразу к области практического применения — как сделать, чтобы включение ШИМ светодиода привязать к какому-либо событию, например, к выводу будильника на этом же МК?

    • admin:

      1. Увеличение периода возможно путём изменения делителя. Чем больше делитель, тем меньше период.

      2. Только программно. Например с помощью какого-нибудь флага. Произошло событие — установили флаг в 1, окончилось — в 0. А уже в цикле отслеживать значение флага, и в зависимости от значения использовать или не использовать алгоритм управления ШИМом.

    • Игорь:

      Чтобы светодиод разгорался 3 минуты, вам нужно в коде в течении 3 минут постепенно увеличивать скважность, то есть вот тут:
      while(1)

      {

      if (pwm_state==0)

      {

      OCR2++;

      if (OCR2>254)

      {

      pwm_state=1;

      }

      }

      if (pwm_state==1)

      {

      OCR2–;

      if (OCR2<1)

      {

      pwm_state=0;

      }

      }

      _delay_ms(3);

      }
      то есть вот тут увеличить задержку до _delay_ms(706); тогда светодиод будет плавно разгораться 3 минуты.

  2. Евгений:

    Для протеуса скопируем и один из первых проектов и подключим через токоограничивающий резистор светодиод к ножке 19, через которую мы и управляем ШИМом. Также подключим измерительный прибор вот здесь. Не на 19 линиию. а на 17. 

    Кстати, если подключить на 17 линию шаговый двигатель, то на неё надо подключать  все четыре обмотки? Ну как? через сдвиговый регистр? или все равно для таких целей нужно все таки использовать программное управление шим?

    • Пока ничего не понял. Проект отработан был сто раз, хотя и давно это было. Я сейчас уже далеко ушел от этой темы. Разбираться придется долго. Как будет время разберусь. Только вот при чем тут обмотки? у меня ничего нет про обмотки. Про шаговый двигаетиль совсем другой урок.

  3. Павел:

    Здравствуйте.Уважаемый админ, не могли бы Вы подсказать,как правильно реализовать цикл : При нажатии и удержании кнопки, скважность ШИМ возрастает с нуля до OСR2=155. При отпускании кнопки ШИМ выключается.

    • Здравствуйте!
      Смотрите уроки дальше и, думаю, разберётесь. Так как по однокнопочному интерфейсу работа в более поздних проектах. По-моему, когда создаём часы с LED-индикатором.

  4. Павел:

    Большое спасибо за ответ ! Я просмотрел эти темы. Откровенно говоря, без помощи не справлюсь. Вроде и задачка простая…
    Я так понимаю, обычным опросом кнопки типа:
    if ((! (PONB&(1 <<PB1))) тут не обойтись !? Нужно какой-то счетчик вводить дополнительно.?

  5. Left:

    Добрый день. Если будет свободное время (а его никогда нет)))), запишите урок по программной реализации ШИМ. Хочу сделать себе подсветку ступенек, чтоб при срабатывании датчика на втором этаже, ступеньки плавно поочередно засвечивались с верху в низ, посветили 2 мин. и плавно погасли, а при срабатывании датчика на первом этаже,ступеньки плавно поочередно засвечивались с низу в верх, посветили 2 мин. и плавно погасли. Сам пока разбираюсь с инфой о программной реализации.

  6. Trackout:

    Почему у Вас в исходном коде присутствует файл main.c? О его создании (или его переносе из других уроков) в этом уроке ничего не сказано.

  7. AVP:

    Здравствуйте!
    А вот эта статья, мне помогла реализовать мой проект. За что Вам огромное СПАСИБО!!!

  8. uuu000:

    1.Зачем в коде для main.h присутствует функция void init_PWM_timer(void),
    ведь там только дефайны и пр. определения.
    2.В двух файлах main.h и PWM.h есть файлы библиотеки прерываний,она ведь тоже
    не нужна.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*