| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Программный ШИМ на AVR https://radiokot.ru/forum/viewtopic.php?f=57&t=79601 |
Страница 1 из 2 |
| Автор: | mich91 [ Ср окт 24, 2012 16:37:25 ] |
| Заголовок сообщения: | Программный ШИМ на AVR |
Код: interrupt [TIM1_COMPA] void timer1_compa_isr(void) { TCNT1H=0x00; TCNT1L=0x00; if(count>=PWM_digit) count=0; count++; if(value<count) { PWM_out=0; } else { PWM_out=1; } } Мой вариант программного ШИМа, где скважность импульсов задает value, 0<=value<=PWM_digit.Можно легко через CASE добавить нужное количество ножек с независимой регулировкой ШИМ,например вот так Код: for(i=0;i<=Chanel_Count;i++) { if(count<Chanel_Lev[i]) { switch(i) { case 0 : PORTD.0=1;break; case 1 : PORTD.1=1;break; case 2 : PORTD.2=1;break; case 3 : PORTD.3=1;break; case 4 : PORTD.4=1;break; case 5 : PORTD.5=1;break; case 6 : PORTD.6=1;break; case 7 : PORTD.7=1;break; } } else { switch(i) { case 0 : PORTD.0=0;break; case 1 : PORTD.1=0;break; case 2 : PORTD.2=0;break; case 3 : PORTD.3=0;break; case 4 : PORTD.4=0;break; case 5 : PORTD.5=0;break; case 6 : PORTD.6=0;break; case 7 : PORTD.7=0;break; } } } Но в этом алгоритме есть минус в том что частота ШИМа равна (Частота прерываний таймера)/(количество ступенек регулирования(PWM_digit)), тоисть чем больше ступенек тем меньше частота. Может есть какой нибуть другой алгоритм или все же невозможно без потерь частоты ШИМ сделать ? |
|
| Автор: | Ser60 [ Ср окт 24, 2012 16:57:26 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Попробуйте вторй switch написать так: switch(Chanel_Count - i). |
|
| Автор: | urry [ Ср окт 24, 2012 17:13:02 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
http://bsvi.ru/bam-alternativa-shimu/ |
|
| Автор: | vitalik_1984 [ Ср окт 24, 2012 22:41:50 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Вот уж действительно БУМ рулит. более 200 шим по трем проводам.любой оптимизированный программный шим просто меркнет на фоне БУМ (BAM) Ser60 писал(а): Попробуйте вторй switch написать так: switch(Chanel_Count - i). Вы, должно быть забыли, что в switch можно только целые числа запихать.Никаких выражений в процессе работы. В выражении есть переменная i, значит нужно выносить выражение за функцию. И что вообще даст это ваше нововведение? Смену состояния ДРУГОЙ ножки.Если i это номер канала, с которым работаем. |
|
| Автор: | Ser60 [ Ср окт 24, 2012 23:53:11 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Да, видимо я неправильно понял роль переменной i. |
|
| Автор: | BOB51 [ Чт окт 25, 2012 06:26:17 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
vitalik_1984 писал(а): :tea: Вот уж действительно БУМ рулит. более 200 шим по трем проводам. любой оптимизированный программный шим просто меркнет на фоне БУМ (BAM) Не стоит слишком расслабляться...
|
|
| Автор: | vitalik_1984 [ Чт окт 25, 2012 11:15:27 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Цитата: Сделай два варианта ... сразу разницу увидишЬ Как же эта разница будет выглядеть по вашему? Речь идет о программном шим, не аппаратном с аппаратным то как раз все замечательно. В случае с BAM вроде как проще управлять большИм количеством выводов. Хотя возможно это мнение ошибочно. |
|
| Автор: | phanis [ Чт окт 25, 2012 12:47:53 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Еще как вариант можно предложить зажигать светодиод по переполнению таймера, а гасить по совпадению того же таймера. |
|
| Автор: | BOB51 [ Чт окт 25, 2012 14:56:00 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
А вот сооруди макетик ШИМ и BAM с частотой 50-60Гц для светиков и прокрути на том макетике плавный перебор уровня яркости - именно плавный перебор, а не фиксированное значение или прыжки уровня... на макетике с BAM будут несанкционированные мерцания (то-ли погасанием, то-ли вспышкой) : это особенности формирования сигнала на переходах весовых коэффициентов - вместо __--__--__ получается кратковременно что-то вроде__--____--__ или __----____--, но такой "мелочи" вполне достаточно для дискомфорта восприятия при динамическом изменении уровня яркости ("джиттер фазы")... В остальном BAM намного эффективнее по использованию рабочего времени МК (кроме кванта уровня=1 там и BAM и ШИМ равноценны), чем ШИМ |
|
| Автор: | phanis [ Чт окт 25, 2012 15:19:19 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Вот что пишут по этому поводу на одном из форумов Цитата: 1 Возможно Вы не знали, что в ВАМ методе, при переходе значений от 127 к 128 и наоборот возникают артефакты в виде заметного моргания. Такое получается из за того, что при смене вышеуказанных значений соседние периоды ВАМ образуют облась с одним уровнем (в зависимости от напрвления перехода 0 или 1) с периодом равным целому периоду ВАМ. Цитата: Для того, чтобы этого избежать, в каждый следующий период работы ВАМ нужно меняеть направление обработки источник http://forum.getchip.net/viewtopic.php? ... e&start=10 |
|
| Автор: | avreal [ Чт окт 25, 2012 15:24:22 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
BOB51 писал(а): А вот сооруди макетик ШИМ и BAM с частотой 50-60Гц для светиков и прокрути на том макетике плавный перебор уровня яркости - именно плавный перебор, а не фиксированное значение или прыжки уровня... Всего-то? Так это лечится одной дополнительной переменной (фрагмент кода из параллельного разговора по BAM в теме codevision).на макетике с BAM будут несанкционированные мерцания (то-ли погасанием, то-ли вспышкой) Код: volatile uint8_t value; // Сюда верхний уровень пишет нужную яркость
static uint8_t value_cache; static uint8_t mask; interrupt [TIM2_COMP] void timer2_comp_isr(void) { mask <<= 1; if (mask == 0) { mask = 0x01; value_cache = value; // И никаких скачков } OCR2 += mask; if (value_cache & mask) { PORTD.0=1; } else { PORTD.0=0; } } |
|
| Автор: | avreal [ Чт окт 25, 2012 15:38:04 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
phanis писал(а): Вот что пишут по этому поводу на одном из форумов Надо посоображать. Это не то, о чём я -- о смене кода value в середие периода, когда первая половина периода отработает по одному коду, а вторая по другому. От этого промежуточная переменная спасёт.А от такого склеивания - надо подумать, будет оно (даже при промежуточной переменной) проявляться только при частотах на грани восприятия или всегда. |
|
| Автор: | BOB51 [ Чт окт 25, 2012 20:56:27 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Там ведь не только при переходе с 0х7F на 0x80 (или с 0x80 на 0х7F) подобная ситуация встречается - просто это наиболее заметное явление - как один из способов борьбы программное предсказание ситуаций "склеивания" с подстановкой "правильного" значения - однако такой "фокус" избыточно усложняет код. По крайней мере мне это мерцание не понравилось - для фиксированного или ступенчато изменяемого уровня вполне пригодно, но для плавных переливов "не очень". Да и коды я рисую на асме...
|
|
| Автор: | mich91 [ Чт окт 25, 2012 21:45:20 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
avreal писал(а): BOB51 писал(а): А вот сооруди макетик ШИМ и BAM с частотой 50-60Гц для светиков и прокрути на том макетике плавный перебор уровня яркости - именно плавный перебор, а не фиксированное значение или прыжки уровня... Всего-то? Так это лечится одной дополнительной переменной (фрагмент кода из параллельного разговора по BAM в теме codevision).на макетике с BAM будут несанкционированные мерцания (то-ли погасанием, то-ли вспышкой) Код: volatile uint8_t value; // Сюда верхний уровень пишет нужную яркость static uint8_t value_cache; static uint8_t mask; interrupt [TIM2_COMP] void timer2_comp_isr(void) { mask <<= 1; if (mask == 0) { mask = 0x01; value_cache = value; // И никаких скачков } OCR2 += mask; if (value_cache & mask) { PORTD.0=1; } else { PORTD.0=0; } } Как обьяснить то что этот код во втором таймере не пашет, получается что таймер не вовремя меняет счет, а если кинуть без переделок в первый то сразу работает ??? |
|
| Автор: | BOB51 [ Пт окт 26, 2012 06:02:09 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Тогда это уже табличная предкоррекция данных для обработчика |
|
| Автор: | qwerky [ Пт окт 26, 2012 07:32:14 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Цитата: :tea: Вот уж действительно БУМ рулит. более 200 шим по трем проводам. вы хоть загляните в листинг компилятора - программно ШИМ проще и легче БАМа.ШИМ - это один общий счетчик и одно сравнение на канал, для БАМа алгоритм посложнее, тем более заполнение у него далеко неравномерное. если нужно равномерное - тогда уж Брезенхем. |
|
| Автор: | BOB51 [ Пт окт 26, 2012 09:35:35 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
" программно ШИМ проще и легче БАМа " Неверное мнение! Не знаю, что там Сишшшные компиляторы выписивают, но с точки зрения ассемблера BAM реализуется если не на равных, то несколько проще, чем программный ШИМ - зато экономия времени для основной программы безспорна. Единственное обязательное требование - 16-разрядный таймер (при ШИМ возможно применение 8-разрядного с предделителем). ![]() Кстати, насчет программного ШИМ, да еще с некоторыми "прибамбасами" - viewtopic.php?f=3&t=77399&start=60 download/file.php?id=119897 на 13-й тиньке 4 канала 256 градаций с мультиплексированием х4 и выборкой рисунка из ПЗУ (асинхронная картинка для каждого из каналов), но... бедная тинька на пределе возможностей... |
|
| Автор: | qwerky [ Пт окт 26, 2012 10:21:21 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Цитата: Не знаю, что там Сишшшные компиляторы выписивают, но с точки зрения ассемблера BAM реализуется если не на равных ошибаетесь. ШИМ - это инкремент счетчика и одно сравнение на канал. Для ВАМа алгоритм посложнее
|
|
| Автор: | BOB51 [ Пт окт 26, 2012 11:46:57 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Для BAM всего лишь простой сдвиг данных в соответствующий бит порта (даже сравнение не требуется) |
|
| Автор: | qwerky [ Пт окт 26, 2012 11:54:38 ] |
| Заголовок сообщения: | Re: Программный ШИМ на AVR |
Цитата: Для BAM всего лишь простой сдвиг данных в соответствующий бит порта (даже сравнение не требуется) на каких контроллерах возможен прямой сдвиг в бит порта, не подскажете ?
|
|
| Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|



Вот уж действительно БУМ рулит. более 200 шим по трем проводам.
- для фиксированного или ступенчато изменяемого уровня вполне пригодно, но для плавных переливов "не очень".