Приветствую!
Задача такая. Нужен ШИМ. 50 Гц. Скважность 0-88% (должна задаваться программно).
Arduino Nano v.4 (если это принципиально).
Спасибо!
зы: если было, ткните в ссылку. Поиск не помог.
Вид для печати
Приветствую!
Задача такая. Нужен ШИМ. 50 Гц. Скважность 0-88% (должна задаваться программно).
Arduino Nano v.4 (если это принципиально).
Спасибо!
зы: если было, ткните в ссылку. Поиск не помог.
Вот пример хардверного ШИМ на 60Гц
Если ровно 50 Гц нужно, то можно софтовый ШИМ сделать
PHP код:
byte val=128;
void setup()
{
pinMode(5, OUTPUT);
TCCR0B = TCCR0B & 0b11111000 | 5;
}
void loop()
{
analogWrite(5, val); // val значение от 0 до 255
}
Chip, спасибо!
Если не трудно, есть реализация софтового?
Вот пример, выдает на D13 51Гц
Soft PWM для Carduino/Arduino
PHP код:
#define D13_High PORTB |=B00100000
#define D13_LOW PORTB &= B11011111
volatile unsigned int tcnt2;
volatile byte pwm_time;
byte bytes[] = {128};
void setup()
{
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
tcnt2 = 237;
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
}
void loop()
{
}
//****************обработчик прерывания********************
ISR(TIMER2_OVF_vect)
{
TCNT2 = tcnt2;
pwm_time++;
if(bytes[0] > pwm_time) D13_High; else D13_LOW;
}
Сорри, если ламерский вопрос, но, где в этом примере задается скважность?
И еще. Где можно почитать про TIMSK2, TCCR2A и т.д., используемые в коде?
bytes[0]=скважность от 0 до 255
Уже разобрался, спасибо!
так понимаю, что используя прерывание, мы отвязываемся от главного цикла loop()?
код функции loop будет работать асинхронно? правильно?
Все верно
Это вообще отлично!
Chip, приветствую!
Если требуется несколько ШИМов, как поступить?
Как будет выглядеть последний скетч (где используется прерывание) с тремя ШИМ, например, где у каждого можно задать произвольную скважность. Подскажи, если не трудно.
Вот здесь смотри http://www.compcar.ru/forum/showthread.php?t=5869
Понял, спасибо!
Флаг переполнения таймера будет срабатывать с частотой 31000Гц
Ага, понял, а частота ШИМ будет зависеть от переполнения либо обнуления pwm_time.
Тогда осталось не понятно, в формуле
tcnt2 = 256 - (16000000/31000/X)
что означает параметр X?
это регистр таймера, он имеет один байт то есть 256 отсчетов до переполнения, флаг прерывания таймера установится после переполнения. По этому мы считаем по остатку до переполнения.
Проще говоря чем больше значение положенное в регистр тем быстрей переполнится.
P.S.
Только сейчас дошло что ты спрашивал про значение 64 , это предделитель таймера , делящий основную тактовую частоту
Попытался покопать документацию, но так и не пришло ясного осознания, как манипулировать TCCR2A, TCCR2B и сколько класть на прерывании в TCNT2, чтобы иметь конкретную (хотя бы приблизительно) частоту софтового ШИМ. С TCNT2 и pwm_time в общем-то разобрался, но при условии что знаю частоту таймера. Частота таймера, как понимаю, получается из частоты кварца, делённой на некий делитель, запрятанный в регистрах TCCR2A и/или TCCR2B. А вот с ними запутался...
Chip, можно прокомментировать строки:
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
TCCR2B &= ~(1<<WGM22);
регистр TCCR2B имеет три бита предделителя CS20,CS21,CS22
0 | 0 | 0 - таймер/счетчик остановлен
0 | 0 | 1 - нет предделителя
0 | 1 | 0 - предделитель 8
0 | 1 | 1 - предделитель 64
1 | 0 | 0 - предделитель 256
1 | 0 | 1 - предделитель 1024
Спасибо!
Эдуард, а подскажи пожалуйста как запрограмировать ШИМ на 300 гц и на 200 гц? Если не в тягость!
244 Гц не подойдет?
Да я хотел в качестве примера, чтоб разобраться с этим!!!!!
PHP код:
Pins 5 and 6: controlled by Timer 0
Setting Divisor Frequency
0x01 1 62500
0x02 8 7812.5
0x03 64 976.5625
0x04 256 244.140625
0x05 1024 61.03515625
TCCR0B = TCCR0B & 0b11111000 | <setting>;
Pins 9 and 10: controlled by timer 1
Setting Divisor Frequency
0x01 1 31250
0x02 8 3906.25
0x03 64 488.28125
0x04 256 122.0703125
0x05 1024 30.517578125
TCCR1B = TCCR1B & 0b11111000 | <setting>;
Pins 11 and 3: controlled by timer 2
Setting Divisor Frequency
0x01 1 31250
0x02 8 3906.25
0x03 32 976.5625
0x04 64 488.28125
0x05 128 244.140625
0x06 256 122.0703125
0x07 1024 30.517578125
TCCR2B = TCCR2B & 0b11111000 | <setting>;
Спасибо огромное!!!!!!
А почему у второго таймера есть делитель на 32, а у нулевого и первого нет?
Может есть доступное чтиво про таймеры?
В интернете полно описаний таймеров , еще
Спасибо Чип!!!!!!!!!!
А вот если используются два пина (Pins 5 and 6: controlled by Timer 0 ) на один ШИМ, то на них можно подключить два транзистора и задавать разную скважность?
Разную частоту для пары выходов ШИМ висящих на одном таймере нельзя, тоесь частоту можно поменять но только для обоих выходов.
Скважность для этой пары, можно настраивать разную
Во спасибо Чип!!! Значит я всё правильно понимаю!!!)))
Вообще тут стоит просто попробовать на живой Ардуино. Частота-то однозначно одинаковая может только быть, а вот про ширину импульса... в принципе она тем же таймером и задаётся, вроде как... Лучше попробовать: на один вывод шим1, на второй вывод поизменять шим2 и посмотреть, хотя бы на светодиодах как будет яркость на них.