Шим регулятор яркости светодиодов на atmega8
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
транзистор можно любой, главное чтобы управлялось через плюс, и сразу поясню почему все так, шим будет управлять двумя цепочками диодов, каждая из которых состоит из трех последовательно включенных диодов, но это не диодная лента, диоды стоят на плате и минус там везде общий, поэтому и нет возможности управлять яркостью через минус, вот собственно почему изобретается такой велосипед с управлением через плюс.
- Реклама
Ну вот наконец конструктивный ответ
можно было сразу так ответить, может бы меньше ссылками закидывали.
Вот рабочий вариант
Номиналы примерные. Нужно учитывать характеристики транзисторов.
Вот рабочий вариант
Номиналы примерные. Нужно учитывать характеристики транзисторов.
- Вложения
-
- Вот.rar
- (11.22 КБ) 259 скачиваний
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
vitalik_1984 спасибо помог, все работает, вопрос еще такой а как можно реализовать подобное но с полевиком, т.е. чтобы обычный транзюк управлял полевиком, где то на этом форуме находил подобное но там народ так и не пришел к конечному решению
Вопрос в том, какой бюджет проекта. Вообще есть специальные драйверы для полевиков, а есть и вовсе полевики с управлением от 5 вольт. TTL совместимые так сказать.
Вот можно такой схемой на худой конец.
Только нужно смотреть какое там максимальное напряжение на затворе. Если меньше 12,то ставить делитель на резисторах.
Вот можно такой схемой на худой конец.
Только нужно смотреть какое там максимальное напряжение на затворе. Если меньше 12,то ставить делитель на резисторах.
- Вложения
-
- P-channel.rar
- (11.73 КБ) 199 скачиваний
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
схему собрал, но с прошивкой так до конца никак не разберусь, как только пишу строки для работы с eeprom так прошивка начинает вести себя не пойми как, ни одно значение яркости не запоминается и энкодер во втором режиме вообще ничего не делает, как только убираю эти строки работают оба режима и энкодер в обоих режимах и прибавляет и убавляет. Пролез уже все темы где люди работают с памятью, вроде все делаю так но не работает, кто понимает как правильно это организовать поделитесь информацией
Спойлер
Код: Выделить всё
/***
Управляем светодиодом с помощью энкодера ***/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>
unsigned char ee_zn EEMEM;//* переменная размером в 2 байта в EEPROM
volatile char pwm_counter, my_y,my_b, button = 0;
// Обработчик прерывания int0
ISR(SIG_INTERRUPT0)
{
_delay_us(50);
if((PIND & (1 << PD2))==0)
{
_delay_us(50);
if((PIND & (1 << PD0))==0)
{
if(button == 0) //
{
my_y--;
}
if(button == 1) //
{
my_b--;
}
}
else
{
if(button == 0) //
{
my_y++;
}
if(button == 1) //
{
my_b++;
}
}
}
GIFR = (1<<INTF0);
return;
}
ISR (TIMER0_OVF_vect)
{
{
if (button == 0)
{
if (pwm_counter++ > 128)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_y)
PORTB |= (1 << PB0);
}
}
{
if (button == 1)
{
if (pwm_counter++ > 128)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > my_b)
PORTB |= (1 << PB0);
}
}
}
// Главная функция
int main (void)
{
DDRB |= (1 << PB0); // выходы
PORTB = 0x00;
DDRD |= (0 << PD4)|(0 << PD2)|(0 << PD1)|(0 << PD0); // входы
PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0)|(1 << PD4); // подключаем подтягивающие резисторы
TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TCCR0 |= (1 << CS00);
MCUCR |= (0 << ISC00)|(1 << ISC01); // прерывание по заднему фронту INT0(по спаду импульса)
GIFR |= (1 << INTF0); // очищаем флаг внешнего прерывания
GICR |= (1 << INT0); // разрешаем внешние прерывания INT0
sei(); //глобально разрешаем прерывания
{
while(1)
if((PIND&(1 << PD4))==0)// первый режим
{
button = 0;
_delay_ms(10);
//my_y = eeprom_read_byte(&ee_zn); // считали значение из EEPROM
_delay_ms(100);
if((PIND & (1 << PD1))==1) // если нажата кнопка энкодера
{
while((PIND&(1 << PD1))==0){} //ждем отпускания кнопки
//eeprom_write_byte(&ee_zn, my_y ); // записываем 1 значение в EEPROM;
_delay_ms(100);
}
}
}
{
while(2)
if((PIND&(1 << PD4))==1) //второй режим пока нажата кнопка
{
button = 1;
_delay_ms(10);
//my_b = eeprom_read_byte(&ee_zns);
_delay_ms(100);// считали 2 значение из EEPROM
if((PIND & (1 << PD1))==1) // если нажата кнопка энкодера
{
while((PIND&(1 << PD1))==0){} // ждем отпускания кнопки
//eeprom_write_byte(&ee_zns, my_b );// записываем 2 значение в EEPROM;
_delay_ms(100);// ждем отпускания кнопки энкодера
}
}
}
}- Реклама
Что это вообще?
Код: Выделить всё
while(2)
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
второй цикл который выполняется когда зажата кнопка, вообщем вот грубо говоря что я пытался сделать, у устройства два режима работы один когда кнопка поключенная на pd4 не нажата и второй когда она нажата, т.е. вот как я себе представляю все это дело пишем два цикла, у одного условие когда кнопка нажата у второго условие когда отпущена. далее когда цикл начинается он считывает значение из переменной и появляется наша сохранненная яркость, далее если мы изменили яркость нажимаем кнопку энкодера и яркость записалась в память.
Так никто не делает. Цикл вечный и во второй никак не попадет, либо не выйдет.
Нужно пересмотреть логику и подумать как еще можно сделать.
Нужно пересмотреть логику и подумать как еще можно сделать.
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
почему не выйдет, кнопка не просто нажимается и отпускается а именно зажимается
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Потому, что циклу плевать на кнопки, если только они не проверяются в его условии или при проверке в теле цикла не происходит выхода по break.почему не выйдет
А вообще, код без форматирования ОЧЕНЬ трудно читать и анализировать. Но break, например, я там нигде не вижу.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
может так и есть, но что с чтением и записью значения переменной
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
В приведенном коде обращение к EEPROM вообще закомментировано...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
Код: Выделить всё
while(1)
if((PIND&(1 << PD4))==0)// первый режим
{ Приду домой проверю интересно посмотреть на маты компилятора
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
{
while(1) думаю она все таки на месте, код компилируется без ошибок
while(1) думаю она все таки на месте, код компилируется без ошибок
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Все норм, код выглядит так:где фигурная скобка бесконечного цикла? этот код вообще компилируется?
Код: Выделить всё
while (1)
if (...)
{
...
}
Скобка должна стоять после цикла. Только в этом случае от нее будет ожидаемый эффект. А так-то в фигурные скобки конструкции можно заключать произвольно...{
while(1) думаю она все таки на месте
Код: Выделить всё
while (...)
{
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
Это не у кого какие, а как работать будет
Если предположим записать так:
Порт Б никогда не поменяет свое состояние
Зато если цикл организовать ПРАВИЛЬНО
Вот так :
То будет гут
Либо вариант с выходом из вечности.
И мой совет почитать хотя бы азы Керниган и Риччи для начала.
В данном случае, конечно ошибок не будет, так как всего один оператор if в вечном цикле, но все же лучше ставить, чтобы не попасть потом в просак.
Если предположим записать так:
Код: Выделить всё
{
while (1)
if ((PIND&(1 << PD4))==0)
{
...
}
portb=0xFF;//Сюда никогда не попадем
} Зато если цикл организовать ПРАВИЛЬНО
Вот так :
Код: Выделить всё
while ((PIND&(1 << PD4))==0)
{
...
portb=0xFF;
} Либо вариант с выходом из вечности.
Код: Выделить всё
while (1)
{
...
if ((PIND&(1 << PD4))==0){break;}
}
portb=0xFF;//Сюда попадем сразу после выхода из условно бесконечного цикла Да я то понимаю как код выглядит. Это я решил проверить как молодой кот осознает зачем какая скобка нужна.YS писал(а):Все норм, код выглядит так:
И мой совет почитать хотя бы азы Керниган и Риччи для начала.
В данном случае, конечно ошибок не будет, так как всего один оператор if в вечном цикле, но все же лучше ставить, чтобы не попасть потом в просак.
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
не совсем понял из твоего поста как организовать обо цикла, и зачем нужно это portb=0xFF?
И только пожалуйста разъясни попроще, я не программер, си учил только в инсте и то уже ничего не помню, поэтому и написал все так криво
И только пожалуйста разъясни попроще, я не программер, си учил только в инсте и то уже ничего не помню, поэтому и написал все так криво
- Сообщения: 60
- Зарегистрирован: Пн авг 26, 2013 23:24:01
break это насколько я могу понять вывод из цикла то есть когда условие не выполняется break прерывает цикл это я прваильно понял?


