Страница 1 из 1
Шим+ светодиод [решено]
Добавлено: Пн сен 22, 2008 19:41:22
Ekzi
Решение
Здравствуйте!
Я можно сказать, плохо рублю в практике, хотя активно учу теорию. Вот хочу реализовать интересную вещь, но все упирается в отсутствие знаний.
Итак, это должен быть светодиод, пусьсирующий, тоест плавное затухает, плавно зажигается. Он весит где то на высоте пол метра и должен хорошо стетить на пол(суперяркий?) Единственная проблема, это питание для него. Максимально, 2 пальчиковые.
Как мне видится решение этой проблемы.
1. Светодиод больше 5 кД.
2. Емкие батарейки, либо аккумуляторы по 2500 мА.
3. Самое сложное, контроллер с шим. Который будет заставлять светодиод пульсировать.
Вот тут то и помогите, пожалуйста. Какой контроллер взять, как управлять шимом? Как это реализовать.
Буду благодарен.
Добавлено: Пн сен 22, 2008 21:11:47
NiTr0
ATMega8 (если габариты - 28 лап - устраивают, если нет - какую-то ATtiny, по цене - они где-то на уровне, в моем городе на радиорынке по $1.5). Алгоритм примитивный

Светодиод через транзюк вешается на выход ШИМ. ШИМ - аппаратный. В прерывании от таймера2 (он же ШИМ) - менять значение OCR0 в большую/меньшую сторону на единицу согласно флагу направления счета (в каком-то регистре завести) вплоть до переполнения/достижения 0, после чего - менять флаг направления счета...
Добавлено: Пн сен 22, 2008 21:14:28
Ekzi
NiTr0 писал(а):Алгоритм примитивный

Вот алгоритм для меня и загадка)) На с++ пишу без проблем, а где этот ШИМ на микрухе и как прописать цикл с изменением его я без понятий. Потому и прошу помощи))
Добавлено: Пн сен 22, 2008 21:15:46
NiTr0
Ekzi писал(а):а где этот ШИМ на микрухе
В даташите все красиво описано

Добавлено: Пн сен 22, 2008 21:32:24
KIP
Ekzi писал(а):NiTr0 писал(а):Вот алгоритм для меня и загадка)) На с++ пишу без проблем, а где этот ШИМ на микрухе и как прописать цикл с изменением его я без понятий.
ШИМ на AVR автономная. Настраивается очень просто, потребуется всего-лишь заполнить некоторые биты в нужных регитрах. Ну и надо немного разобраться почитав принцип ШИМ и узнать с какими регистрами работать.
Добавлено: Пн сен 22, 2008 21:58:27
tych
KIP писал(а):Ekzi писал(а):
ШИМ на AVR автономная.
Не на всех. Про работу с аппаратным ШИМ я сделал задачу 8 в домашней страничке. А програмный ШИМ в задаче 13.
Добавлено: Пн сен 22, 2008 22:14:59
pirotehnick
Ekzi писал(а):где этот ШИМ на микрухе и как прописать цикл с изменением его я без понятий. Потому и прошу помощи))
Здесь посмотри
http://www.pcports.ru/articles/avr3.php
Добавлено: Вт сен 23, 2008 03:38:20
Mamonth
Под кнопкой www есть статья по ШИМ и как его заводить и как посмотреть и что в этом ШИМе куда.
Добавлено: Вт сен 23, 2008 13:54:38
Ekzi
Спасибо всем кто ответил по делу- материал увидел и изучил.
В любом случае, я всю инфу выучу и попробую все таки собрать схемку.

Добавлено: Вт мар 24, 2009 16:28:27
Ekzi
На долгое время отложил решение этого вопроса, но сейчас снова стало интересно, а как же, все таки, оно должно было работать. У меня attiny13
Код беру из
http://arv.radioliga.com/index.php?opti ... &Itemid=44
Кто-нибудь подскажет, как исправить код, чтобы значение шим плавно, но достаточно быстро изменялось в цикле с 255 до 0 и назад.
Добавлено: Вт мар 24, 2009 16:47:44
ikarab
Ekzi писал(а):как исправить код, чтобы значение шим плавно, но достаточно быстро изменялось в цикле с 255 до 0 и назад.
Посмотрите "Микроконтроллеры AVR для начинающих" и другие книги
в библиотеке книг для скачивания и чтения и сами сможете понимать и менять код как вам надо.
ВОЗМОЖНО вот так будет работать 1 ШИМ
Код: Выделить всё
вверху проги,
// в CVAVR так: #include <delay>
#include <util> // библиотеки пауз
// там где переменный объявляются
char pwm_val = 255;
char pwm_rastet = 0;
// изменить цикл for (;;) вот так:
for (;;){
if(pwm_rastet){ // если ШИМ должен расти
pwm_val ++; // увеличить ШИМ
if (pwm_val==255) // если ШИМ достиг 255
pwm_rastet = 0; // его надо будет уменьшать
}
else{ // если ШИМ должен уменьшаться
pwm_val --; // уменьшить ШИМ
if (!pwm_val) // если ШИМ достиг 0
pwm_rastet = 1; // его надо будет увеличивать
}
OCR0A = pwm_val; // вывести вычесленное значение ШИМ
// в CVAVR так delay_us(100);
// пауза определяет как часто будет меняться величина ШИМ
_delay_us(100); // Пауза 100 МикроСек.
}
НЕ ПРОВЕРЯЛ, не компилировал. Просто накрапал по-быстрому.
Добавлено: Вт мар 24, 2009 17:38:10
Ekzi
Спасибо, попытался посильно исправить ошибки. ide - avr studio
Сейчас светодиод тускленько горит и все
Код: Выделить всё
#include <util>
#include <avr>
//#include <util> // библиотеки пауз
// там где переменный объявляются
char pwm_val = 255;
char pwm_rastet = 0;
// изменить цикл for (;;) вот так:
int __attribute__((naked)) main (void) {
DDRB = (1<<PB0); // выход ШИМ
for (;;){
if(pwm_rastet){ // если ШИМ должен расти
pwm_val ++; // увеличить ШИМ
if (pwm_val==255) // если ШИМ достиг 255
pwm_rastet = 0; // его надо будет уменьшать
}
else{ // если ШИМ должен уменьшаться
pwm_val --; // уменьшить ШИМ
if (!pwm_val) // если ШИМ достиг 0
pwm_rastet = 1; // его надо будет увеличивать
}
OCR0A = pwm_val; // вывести вычесленное значение ШИМ
// пауза определяет как часто будет меняться величина ШИМ
_delay_us(100); // Пауза 100 МикроСек.
}
}
Добавлено: Вт мар 24, 2009 17:42:21
ikarab
Я ж вам "изменить цикл" показал как, а вы все остальное выкинули чтоль ? Там же настройка ШИМ должна быть и ножка выходом назначена.
Добавлено: Вт мар 24, 2009 19:54:55
бгкот
Вот как выглядит решение задачки на пик-бейсике:
Код: Выделить всё
; любой PIC 12,16
; переменные:
j VAR BYTE
led VAR PortB.0 ; вывод управления светодиодом
; константы:
slow CON 16 ; определяет скорость изменения
; вот и програмка:
OUTPUT led ; вывод определяется как выход
WHILE 1 ; безконечный цикл
led = ~led ; переключение в противоположное состояние
PAUSEUS (127 + SIN j) * slow ; пауза в микросекундах
led = ~led ; переключение в противоположное состояние
PAUSEUS (127 - SIN j) * slow ; пауза в микросекундах
j = j + 1
WEND
ШИМ - програмный, изменение яркости - по гармоническому закону,
что кстати, лучьше смотрится, чем по линейному.

Добавлено: Вт мар 24, 2009 22:28:03
Ekzi
Вот, получилось- все работает. Привожу кривокод. Может, кто еще что подскажет по нему, или может, он поможет кому-нибудь
Код: Выделить всё
#include <avr>
#include <util>
char pwm_val = 255;
char pwm_rastet = 0;
// прерывание по переполнению таймера
ISR(TIM0_OVF_vect){}
int __attribute__((naked)) main (void) {
DDRB = (1<<PB0); // выход ШИМ
// настройка таймера
TCCR0A = 0b10110011; // Fast-PWM, выходы А и В в противофазе
TCCR0B = 0b00000001; // без предделителя
// настройка прерываний
TIMSK0 = (1<<TOIE0); // по переполнению таймера
sei (); // разрешаем глобально
// главный цикл
for (;;){if(pwm_rastet){ // если ШИМ должен расти
pwm_val ++; // увеличить ШИМ
if (pwm_val==255) // если ШИМ достиг 255
pwm_rastet = 0; // его надо будет уменьшать
}
else{ // если ШИМ должен уменьшаться
pwm_val --; // уменьшить ШИМ
if (!pwm_val) // если ШИМ достиг 0
pwm_rastet = 1; // его надо будет увеличивать
}
OCR0A = pwm_val; // вывести вычесленное значение ШИМ
// пауза определяет как часто будет меняться величина ШИМ
_delay_us(1000); // Пауза 100 МикроСек.
}
}
Re: Шим+ светодиод [решено]
Добавлено: Вс ноя 07, 2010 00:51:54
BBC 67
Попытался скомпилировать сиё смотри код Ekzi [ Вт мар 24, 2009 22:28:03 ]
из под IAR 5.4 , не получилось:
Fatal Error[Pe005]: could not open source file "avr" E:\CBB\sreda programm\lib for stop\MK\psw led3\main.cpp 1
Error while running C/C++ Compiler
цитата:
На долгое время отложил решение этого вопроса, но сейчас снова стало интересно, а как же, все таки, оно должно было работать. У меня attiny13
Код беру из http://arv.radioliga.com/index.php?opti ... &Itemid=44
Кто-нибудь подскажет, как исправить код, чтобы значение шим плавно, но достаточно быстро изменялось в цикле с 255 до 0 и назад.
Меняю библиотеку "avr"на "ioavr" под attiny13, не помогает

...подскажите плиз что там "внутри"??, перебирать все подряд сил уже нет.
...утешает другая цитата:
Вот, получилось- все работает. Привожу кривокод. Может, кто еще что подскажет по нему, или может, он поможет кому-нибудь
Идея старая но очень хочется: сделать для габаритов шим, а stop на прямую в обход МК на транзистор ...
можно конечно и на 555 таймере юзать "габарит" но как-то не современно, контроллер сможет и вспышки и всё что угодно.