Страница 1 из 2
ШИМ и atmega
Добавлено: Сб янв 08, 2011 00:10:25
m210
Здравствуйте всем и всех с праздниками
В общем долгое время борюсь с построением ШИМ регулятором светодиодов...проблема в том, что светодиод не тухнет при OCR=0x00, т.е. переменная вроде бы как на 0, а светодиод все равно горит в пол накала...пробовал на Atmega8535, Atmega48 и Atmega168, последние в плане работы мне вообще не нравятся, ШИМ в них то работает то нет и в основном все хаотично моргает глючит и т.д. а если и начинает работать то светодиод полностью не тухнет....
у 8535 дело получше - 2 светодиода тухнут полностью, а один также горит в пол накала, хотя свечение менее интенсивное, можно сказать почти не горит, но все же заметно.
Код вот такой:
Код: Выделить всё
#include <mega8535.h>
#define R_channel OCR1AL //Определяем канал OCR1AL для Красного цвета
#define G_channel OCR1BL //Определяем канал OCR1BL для Зеленого цвета
#define B_channel OCR2 //Определяем канал OCR2 для Синего цвета
#define RGB_pause 2000 //Пауза для задержки
//Программа формирования задержки
void pause (unsigned int a)
{
unsigned int i; //Переменная для задержки
for (i=a;i>0;i--); //Цикл формирования задержки
}
//Программа инициализации ШИМ
void init_pwm (void)
{
//Инициализация порта
DDRD=0xFF; //OC1A,OC1B,OC2 - выхода
TCCR1A=0b10100001; //Конфигурация счетчика OC1A A1
TCCR1B=0b00000001; //Конфигурация счетчика OC1B 01
TCCR2=0b01100001; //Конфигурация счетчика OC2 61
//Установка начальных значений счетчиков
OCR1AL=0xff; //Соответсвует Красному цвету
OCR1BL=0x00; //Выключен 0
OCR2=0x00; //Выключен 0
}
//Основная программа
void main(void)
{
unsigned char i;
init_pwm(); //Инициализация ШИМ каналов
while (1) //Вечный цикл
{
for(i=0;i<255;i++) //Переход от красного к зеленому
{
R_channel--;
G_channel++;
pause(RGB_pause);
}
for(i=0;i<255;i++) //Переход от зеленого к синему
{
G_channel--;
B_channel++;
pause(RGB_pause);
}
for(i=0;i<255;i++)//Переход от синего к красному
{
B_channel--;
R_channel++;
pause(RGB_pause);
}
}
}
Не полностью тухнет красный светодиод...
чтонить с этим можно сделать? Особенно это касается как раз 48 88 168 атмег, которые вообще не хотят работать с ШИМ и выключать светодиод
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:03:49
YS
Вот неправда. Как раз таки на ATmega48 я лично делал контроллер RGB линейки - ШИМ работает прекрасно и стабильно. Исходники во вложении (правда, они на асме).
Приведите схему - возможно, проблема носит аппаратный характер.
Код Ваш сейчас посмотрю.
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:09:34
YS
Посмотрел код.
Попробуйте заменить OCRnXL просто на OCRnX.
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:12:14
m210
А можно тогда готовую прошивку, компилятором и самими знаниями ассэмблера я видимо не владею
Сейчас задумался - подключал светодиод без резистора, хотя 8535 тоже управляет светодиодами без резистора, но может ли это быть причиной постоянной перезагрузки МК?
А код тогда смотреть лучше этот:
Код: Выделить всё
#include <mega48.h>
#define R_channel OCR0A //Определяем канал OCR1AL для Красного цвета
#define G_channel OCR0B //Определяем канал OCR1BL для Зеленого цвета
#define B_channel OCR2A //Определяем канал OCR2 для Синего цвета
#define RGB_pause 2000 //Пауза для задержки
//Программа формирования задержки
void pause (unsigned int a)
{
unsigned int i; //Переменная для задержки
for (i=a;i>0;i--); //Цикл формирования задержки
}
//Программа инициализации ШИМ
void init_pwm (void)
{
DDRB=0x08;
DDRD=0x68;
TCCR0A=0xA3;
TCCR0B=0x01;
TCCR2A=0xA3;
TCCR2B=0x01;
//Установка начальных значений счетчиков
OCR0A=0xff; //Соответсвует Красному цвету
OCR0B=0x00; //Выключен 0
OCR2A=0x00; //Выключен 0
OCR2B=0x00; //Выключен 0
}
//Основная программа
void main(void)
{
unsigned char i;
init_pwm(); //Инициализация ШИМ каналов
while (1) //Вечный цикл
{
for(i=0;i<255;i++) //Переход от красного к зеленому
{
R_channel--;
G_channel++;
pause(RGB_pause);
}
for(i=0;i<255;i++) //Переход от зеленого к синему
{
G_channel--;
B_channel++;
pause(RGB_pause);
}
for(i=0;i<255;i++)//Переход от синего к красному
{
B_channel--;
R_channel++;
pause(RGB_pause);
}
}
}
Этот тот же код, но под 48ю мегу и который не очень то хочет работать в тех же условиях
Код: Выделить всё
Попробуйте заменить OCRnXL просто на OCRnX.
ок, это можно

Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:15:21
Danko
Оба Ваши счетчика работают в режиме Phase Correct PWM.
В этом режиме каждый счетчик работает в реверсивном режиме т.е. сначала он прибавляет, а затем отнимает.
Попробуйте выбрать режим Fast PWM.
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:22:00
m210
YS писал(а):Посмотрел код.
Попробуйте заменить OCRnXL просто на OCRnX.
Поменял, действительно помогло! Хотя не очень понимаю смысла этой
L
Danko писал(а):Попробуйте выбрать режим Fast PWM.
Для Atmega48 я выбираю именно этот режим, разве нет?
На самом деле действительно надо было выложить код для 48 меги а не для 8535, в которой работает все более стабильно.
И тут дело в том, что 8535 это мой самый первый МК, поэтому я начал с того что сделал ШИМ на нем и сам МК использую для тестирования, но для моего будущего устройство 8535 явно жирно, поэтому я начал перегонять весь свой код на 48ю мегу и столкнулся там проблемами в реализации ШИМ...кстати сейчас я понимаю, что скоро мой код не будет влезать на 48 мегу, буду брать 88ю, но я надеюсь что сделав нормальный ШИМ на 48й меге, код будет без труда работать на 88й.
А в 48 и имеющейся у меня 168 меге при написании ШИМа и подключении к МК светодиода, он хаотично перезагружается, хотелось бы знать почему?
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:29:35
YS
Прошивка для ATmega48 во вложении. После включения начинает плавно перебирать цвета.
PD6 - R
PD5 - G
PB3 - B
Поменял, действительно помогло! Хотя не очень понимаю смысла этой L
Даташитик-то почитайте.

L на конце имени регистра означает, что этот регистр является младшим байтом регистровой пары. Например, шестнадцатибитный регистр OCR1A распадается на OCR1AH - старший байт и OCR1AL - младший байт. Этот факт имеет значение в основном только при написании программ на ассемблере - при написании прошивки на языке высокого уровня следует использовать только общее имя регистра, например, OCR1A. Высокоуровневый компилятор сам разберется, что куда писать.
А в 48 и имеющейся у меня 168 меге при написании ШИМа и подключении к МК светодиода, он хаотично перезагружается, хотелось бы знать почему?
Светодиоды всегда подключаются
только через резистор или стабилизатор тока.
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:32:14
Danko
m210 писал(а):Для Atmega48 я выбираю именно этот режим, разве нет?
На самом деле действительно надо было выложить код для 48 меги а не для 8535, в которой работает все более стабильно.
Это такой прикол. Выкладывать один код, говорить о другом, а ошибки исправлять в третьем.
Код: Выделить всё
#include <mega8535.h>
TCCR1A=0b10100001; //Конфигурация счетчика OC1A A1
TCCR1B=0b00000001; //Конфигурация счетчика OC1B 01
TCCR2=0b01100001; //Конфигурация счетчика OC2 61
И это Fast PWM?
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:40:36
m210
YS писал(а):Прошивка для ATmega48 во вложении. После включения начинает плавно перебирать цвета.
Спасибо, сейчас попробую подключить и как раз проверю, есть ли разница подключения с резистором и без него...а то что светодиод питается током а не напряжением это я знаю, но разве имеет ли это значение когда нужно просто проверить работоспособность прошивки МК?
Ведь в данном случае резистор там ставят просто для защиты порта от перегрузки, который держит только 20мА.
Danko писал(а):Это такой прикол. Выкладывать один код, говорить о другом, а ошибки исправлять в третьем.
Да прощу прощения, моя вина....просто думал что нет особого смысла дублировать похожий код для разных МК, в 8535 действительно используется Phase Correct PWM, но в 48 меге я использую Fast PWM и выложил код под 48мегу ниже постом.
Повторюсь, что особые проблемы вызывают 48я, надо было заострять внимание на ней а не на 8535й меге
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 01:55:22
YS
Ведь в данном случае резистор там ставят просто для защиты порта от перегрузки, который держит только 20мА.
Если резистор не поставить - перегрузка обязательно будет. Открытый светодиод - это КЗ.
Светодиод всегда ставится последовательно с резистором. Думайте о светодиоде и резисторе как о едином блоке. И, включая в схему светодиод, автоматически дорисовывайте резистор. Иначе никак. Ну а мощным светодиодам уже требуются более серьезные схемы стабилизации, там даже резистор не катит. Почитайте тему по ссылке дальше, там писалось много правильных вещей.
Когда зальете мою прошивку, подтяните ножку RX UART'а к питанию резистором порядка 10К. Дело в том, что прошивка расчитана на соединение с ПК, ну и чтобы помехи не садились и не мешали...
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 02:11:25
m210
ок,тему почитаю
По поводу вашей прошивки, какой там алгоритм?
Я подключал один светодиод отдельно к 3м портам, на первом светодиод увеличивает яркость с минимума до максимума и зависает на максимальной яркости, при этом минимум яркости опять же небольшое свечение светодиода, увеличение яркости происходит секунд 10 наверно, на втором светодиод горит в каком то скажем, среднем положении, на третьем порте светодиод просто горит.
Светодиод я подключал с резистором (но потом для проверки его убрал и увидел туже картину)
А в целом - подключая + и - на МК и вешаю светодиод с резистором на порт...и видимо прошивка я так понял работать не очень то хочет?
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 02:12:31
m210
YS писал(а):
Когда зальете мою прошивку, подтяните ножку RX UART'а к питанию резистором порядка 10К. Дело в том, что прошивка расчитана на соединение с ПК, ну и чтобы помехи не садились и не мешали...
Сейчас попробую. может быть прошивка так заведется

Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 02:22:11
m210
Подключил резистор 12кОм
Ну могу сказать, что PD5 - моргает от среднего до максимума
PD6 - увеличивается от мин до макс более быстро, чем без резистора 12кОм на RXе
PB3 - имеет минимум, но светодиод еле горит, все равно заметно
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 18:12:17
m210
Скачал 2 прошивки для 48й меги и еще раз убежился что светодиод полностью не гаснет никогда....видимо косяк этого симейства,...жаль что у 8й меги нет 4 ШИМа, а 8535 слижком жирко для моего устройства

Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 18:53:28
YS
Как я уже говорил, моя прошивка без подключения к ПК просто перебирает цвета. На каждой ножке это должно выглядеть как разгорание-максимальная яркость-погасание со сдвигом по фазе относительно других ножек.
Светодиоды должны быть подключены к МК анодом ("+").
Все же, приведите схему.
Вот зуб даю, что с ШИМом в мегах все хорошо, просто Вы делаете что-то не так. Конкретно могу говорить как раз про mega48, ибо с ней работаю давно и плотно.
mega88 и mega168 - суть то же самое, что mega48, различие только в объеме памяти.
Какая у Вас частота МК? Моя прошивка расчитана на 8МГц тактирование. Это указано непосредственно в исходнике.
Подключая светодиод без резистора, Вы могли спалить/повредить порт. Попробуйте прошивку на другом МК, подтягивая RX к питанию.
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 19:39:25
m210
Да не, порт вроде работает, сейчас решил сделать небольшую имитацию включения зажигания автомобиля, на видео показал что если подавать напряжение на порт через резистор (430Ом у меня) то светодиод не откликается, поэтому подавал на порт прямое напряжение 5В, тогда светодиод начинал плавно разгораться.
http://www.youtube.com/watch?v=ATxk4eOQmW0 - вот видео, где видно, что светодиод светится при минимуме ШИМ.
Там же можно видеть и схему, рисовать ее не буду, ибо вроде как видно и так, что я подключаю и куда: 7я нога VCC - красный провод, 8я нога - GND - черный провод, 5я нога это порт ШИМ, и 28я нога это нога при подаче на которую напряжения, начинает работать код регулятора светодиода (тут не знаю, правильно ли я делаю, что подаю напряжение напрямую, но через резистор не включается)
Светодиод анодом подключен к порту через резистор 360Ом (какой под руку попался, такой и поставил) и катодом на GND соответственно.
Ну вроде как и все, жду комментарий...и на всякий случай аттач с прошивкой, кодом и схемой промитеуса
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 20:21:01
YS
7я нога VCC - красный провод, 8я нога - GND - черный провод, 5я нога это порт ШИМ, и 28я нога это нога при подаче на которую напряжения, начинает работать код регулятора светодиода (тут не знаю, правильно ли я делаю, что подаю напряжение напрямую, но через резистор не включается)
Если бы Вы внимательнее прочитали даташит, то узнали бы, что в любом режиме работы ОБЯЗАТЕЛЬНО должны быть также подключены AVCC (пин 20, напрямую к питанию) и второй вывод GND (пин 22, земля).
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 21:21:41
m210
Ну честно говоря я не читал даташит на 48мегу, не хочу часа сидеть с переводчиком и разбираться о чем там написано, но все-же по AVCC и AGND возникает вопрос:
Если они должны быть подключены всегда, почему этого не сделали в самой МК?
2) В атмеге 8535 и без подключения этих выводов все работает
Хы, а я то думал, вот мое счастье, ан нет, после подключения иных не изменилось ровным счетом ничего, как горел светодиод, так и горит

Но все равно спасибо за совет

Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 21:48:47
YS
Ну честно говоря я не читал даташит на 48мегу, не хочу часа сидеть с переводчиком и разбираться о чем там написано
Угу. Действуете методом тыка, а потом удивляетесь, чего это оно не работает. Теперь причина ясна.

А с переводчиком сидеть не надо. Просто надо один раз выучить английский...
Если они должны быть подключены всегда, почему этого не сделали в самой МК?
2) В атмеге 8535 и без подключения этих выводов все работает
Потому, что при использовании АЦП напряжение на AVCC должно быть дополнительно отфильтровано, а если мы его не используем, то можно подключать прямо к питанию. Опять же, это написано в даташите. Прочитайте его, не поленитесь.
2) В атмеге 8535 и без подключения этих выводов все работает
Ну, в даташите написано, что напряжение питания меги 5В, а я к 12В подключал нечаянно, и ничего... Только сколько она так проработает...
Значит Вам повезло. А могло не повезти, как с mega48. Мне почему-то кажется, что вы ее повредили...
В общем, давайте я, когда освобожусь, напишу референсный код для работы с PWM на С, и выложу его...
Re: ШИМ и atmega
Добавлено: Сб янв 08, 2011 22:23:00
m210
В общем, давайте я, когда освобожусь, напишу референсный код для работы с PWM на С, и выложу его...
А разве мой код не поможет? зачем писать заного?
Ну в целом для меня как информация лишним не будет, буду ждать

Спасиб
а на счет метода тыка - ну да, таким образом я написал и термометр и часы и вольтметр, про AVCC и AREF знаю и узнал чисто потому что поставил себе цель сделать вольтметр...хотя там тоже есть проблема

Он вычисляет напряжение только в момент старта МК и потом не значение не меняется, хотя я знаю почему это происходит но как исправить пока не знаю, но это потом, после того как закончу часть с ШИМ
Потом выложу проект целиком, тоже есть вопросы
