roboforum.ru

Технический форум по робототехнике.


Atmega16 ШИМ, Вопрос

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Atmega16 ШИМ, Вопрос

Сообщение mgrokhotov » 03 фев 2012, 15:54

Разбираюсь с работой аппаратного ШИМ на atmege16, взял один из примеров, рассмотренных в интернете, код на сях такой:

Код: Выделить всёРазвернуть
#include <avr/io.h>
//Програма инициализации ШИМ
void init_pwm (void)
{
  TCCR1A=(1<<COM1A1)|(1<<WGM10); //На выводе OC1A единица, когда OCR1A==TCNT1, восьмибитный ШИМ
  TCCR1B=(1<<CS10);       //Делитель= /1
  OCR1A=0x00;         //Начальное значение
}

//Основная програма
int main(void)
{
unsigned char i;

DDRD=0x32;            //Инициализация PD5 (OC1A) как выход
init_pwm();
OCR1A=0x40;

while (1)
  {

  }

return 1;
}


Компилирую всё это дело в AVRStudio, схему тоже взял из примера:
Изображение

В примере объяснений мало и ничего не понятно. Пытаюсь менять по-разному значение OCR1A, но закономерность интуитивно не могу понять.
Может кто-нибудь внятно объяснить что означает каждая строчка в подпрограмме инициализации (init_pwm), какие параметры ФНЧ(R и C) и значение OCR1A мне нужно брать , допустим, если я хочу получить на выходе PD5 сначала 1В а потом 3В (т.е. прошу два примера для ясности)?

Спасибо заранее!
mgrokhotov
 
Сообщения: 4
Зарегистрирован: 12 янв 2010, 10:56
Откуда: SPb

Re: Atmega16 ШИМ, Вопрос

Сообщение boez » 03 фев 2012, 16:42

Питание сколько?
А вообще закономерность простая - выходное = питание * OCR1A / 256 , поскольку ШИМ у тебя восьмибитный. ФНЧ влияет только на пульсации и быстродействие. Постоянная времени фильтра T=R*C, частота среза F=1/T. При изменении ШИМ резко с 0% на 100% выход поменяется с 0 до примерно 60-70% за время Т. Частота среза должна быть меньше частоты ШИМ в несколько раз.

Значение 1 и 2 строчек в инициализации смотри в даташите, стр 110: 16-bit Timer/Counter1 - 16-bit Timer/Counter Register Description. Там задается все - и частота, и разрешение, и какие выходы задействовать.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Atmega16 ШИМ, Вопрос

Сообщение mgrokhotov » 03 фев 2012, 16:57

Да, совсем забыл, питаемся от 5В
mgrokhotov
 
Сообщения: 4
Зарегистрирован: 12 янв 2010, 10:56
Откуда: SPb

Re: Atmega16 ШИМ, Вопрос

Сообщение Romikgy » 03 фев 2012, 17:45

а для чего кондер аж на 10000мкФ ?
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: Atmega16 ШИМ, Вопрос

Сообщение boez » 03 фев 2012, 18:53

ойеее, щас токо заметил - у RC фильтра R=0 :) Незаработает, а в реале можно спалить порт или светодиод. Обязательно нужен резистор не менее 200-300 ом. Последовательно.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Atmega16 ШИМ, Вопрос

Сообщение mgrokhotov » 08 фев 2012, 21:44

Мда, получилось как в анекдоте: "сопротивление бесполезно" =)))
Окей, схему поменял на вот такую:

Изображение

Теперь в программе берём значение OCR1A=0x40.
Как сказал boez
выходное = питание * OCR1A / 256

0x40 переводим в десятичную систему - это будет 68.
Теперь сделаем расчёт по вышеупомянутой формуле: 5 * 68 / 256 = 1.32
А на деле в протеусе получается 1.24:
Изображение

Пробовал разные значения ставить, ни разу не совпало =(
К примеру: ставил OCR1A=0x99. По рассчётам должно получиться 2.98, а на деле - 2.18

Где ещё может быть ошибка?
mgrokhotov
 
Сообщения: 4
Зарегистрирован: 12 янв 2010, 10:56
Откуда: SPb

Re: Atmega16 ШИМ, Вопрос

Сообщение avr123.nm.ru » 09 фев 2012, 00:07

светодиод как стабилитрон.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Atmega16 ШИМ, Вопрос

Сообщение boez » 09 фев 2012, 12:56

http://ru.wikipedia.org/wiki/%D0%A4%D0% ... 0%BE%D1%82

Напряжение будет строго по формуле, если выкинуть светодиод и резистор перенести на место (в последней схеме все равно R=0 и нога нагружена напрямую на конденсатор, это плохо). А светодиод является нелинейной нагрузкой, и напряжение, а тем более яркость (она определяется током) будут меняться нелинейно и сильно зависеть от цвета светодиода. Правильно делать так: с ноги резистор последовательно, потом конденсатор на землю, дальше опять последовательно резистор, того же сопротивления, и светодиод. Светодиод будет светиться так, как если бы он был подключен через эти же 2 резистора к источнику постоянного напряжения, вычисленного по формуле что я давал.

Ну а сам светодиод можно в первом приближении считать стабилитроном на (ИК - 1.2, красный - 1.7, зеленый - 1.9, синий/белый - 3) вольта, яркость пропорциональна току. Т.е. ниже указанных напряжений СД не светится вообще, выше - считаем ток на резисторах по закону Ома и узнаем яркость. Как-то так.

А, да, а еще мелкое замечание - для плавной регулировки яркости СД это исходно неправильный подход :) Выкинуть вообще конденсатор и оставить просто светодиод и резистор, расчитанный на максимальную яркость светодиода. Выдал шим 50% - СД 50% времени светится на полную, 50% потушен. Глаз видит 50% яркости.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30