|
8 канальный шим на avr, Как пеализовать 8 канальный шим |
|
|
|
May 11 2005, 14:47
|
Частый гость
 
Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896

|
Цитата(at90 @ May 11 2005, 16:59) Люди как реализовать 8 канальный 8 битный программный шим для управления светодиодами на С.  Вобщем-то без разницы на каком языке реализовать этот алгоритм. Если в общих чертах то это в моём представлении выглядит примерно так. Пишется процедура прерывания для таймера работающего в автомате, который работает с частотой достаточной для заданной точности (fшим*256). Объявляются 8 переменных, которые будут определять скважность по каждому каналу ШИМ (например в %). И каждая из этих переменных привязывается к одному биту какого-то 8-битного порта (для 50% пол-периода -0, пол-периода -1). По каждому прерыванию таймера делается обновление информации выводимой в порт по всем разрядам.
|
|
|
|
|
May 11 2005, 15:24
|

Знающий
   
Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814

|
Цитата(okela @ May 11 2005, 17:47) Цитата(at90 @ May 11 2005, 16:59) Люди как реализовать 8 канальный 8 битный программный шим для управления светодиодами на С.  Вобщем-то без разницы на каком языке реализовать этот алгоритм. Если в общих чертах то это в моём представлении выглядит примерно так. Пишется процедура прерывания для таймера работающего в автомате, который работает с частотой достаточной для заданной точности (fшим*256). Объявляются 8 переменных, которые будут определять скважность по каждому каналу ШИМ (например в %). И каждая из этих переменных привязывается к одному биту какого-то 8-битного порта (для 50% пол-периода -0, пол-периода -1). По каждому прерыванию таймера делается обновление информации выводимой в порт по всем разрядам. я так реализовал шим на 16 градаций Сделал массив на 16 элементов Каждый элемент массива выводил в порт за один тик тамера. Изменяя биты изменял яркость. Но на 256 делать массив на 256 -зто как то неразумно. Слишком много уходит памяти
--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
|
|
|
|
|
May 12 2005, 12:10
|
Частый гость
 
Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896

|
Цитата(at90 @ May 11 2005, 18:24) я так реализовал шим на 16 градаций Сделал массив на 16 элементов Каждый элемент массива выводил в порт за один тик тамера. Изменяя биты изменял яркость. Но на 256 делать массив на 256 -зто как то неразумно. Слишком много уходит памяти Имелось ввиду держать в памяти не массивы значений для каждого тика таймера, а char переменные для каждого канала, хранящих значения длительности импульса (паузы) для одного периода. Эти значения равны числам переполнений таймера..... Как-то так.
|
|
|
|
|
May 12 2005, 14:38
|

Знающий
   
Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814

|
Цитата(TMX @ May 12 2005, 17:31) unsigned char PWM_cnt, PWM_x[8]; // лучше сделать регистровыми interrupt timer_ISR // обработчик прерывания таймера { unsigned char mask, i; if (++PWM_cnt == 0) // переполнение PWM_PORT = 0; for (i = 0, mask = 0x01; mask; i++, mask <<= 1) if (++PWM_x[i] == 0) PWM_PORT |= mask; // установка выходного бита } А как мы задаём длительность каждого периода или у нас на выходе меандр?
--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
|
|
|
|
|
May 12 2005, 17:03
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064

|
Цитата(at90 @ May 12 2005, 17:38) [А как мы задаём длительность каждого периода или у нас на выходе меандр? Скважность на каждом выходе порта PWM_PORT зависит от содержимого элемента PWM_x. Получается управление по фазе. Попробуйте в симуляторе посмотреть.
|
|
|
|
|
May 12 2005, 17:10
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064

|
Цитата(MicronSys @ May 12 2005, 17:50) А Вы бы не могли сравнить производительность трех приведенных кусков кода? Время выполнения обработчика прерывания в тактах?
|
|
|
|
|
May 13 2005, 07:17
|
Частый гость
 
Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064

|
Цитата(MicronSys @ May 13 2005, 09:11) Этот кусок кода при 1 Меге выполняется 0.51 ms после компиляции в режиме оптимизации 0.38 ms Насколько я помню, надо управлять яркостью: если напрямую, то частота ШИМ должна быть не менее 50 Гц чтобы не было моргания, т.е. для 8-битного частота срабатывания таймера: 50 х 256 = ок.12,5 кГц соотв. период таймера - 80 мкс. Ну, при тактовой частоте 10 МГц будет вполне нормальный результат.
|
|
|
|
|
May 18 2005, 05:05
|

Знающий
   
Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814

|
Цитата(sseett @ May 18 2005, 07:07) Так и должно быть, ведь яркость свечения не линейно зависит от протекающего через светодиод тока. P.S. Как-то делал ребенку елочную гирлянду (то же 8 каналов ШИМ) на сверхярких светодиодах и обнаружил, что использовать более 16 градаций уровня яркости не имеет смысла, изменение яркости практически не заметно. Я поначалу тоже делал на 16 градаций но уменя получилось слишком ступенчатое изменение яркости,на 256 получьше
--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|