Страница 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
Сейчас светодиод тускленько горит и все:cry:

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

#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 таймере юзать "габарит" но как-то не современно, контроллер сможет и вспышки и всё что угодно.