реклама на сайте
подробности

 
 
> 8 канальный шим на avr, Как пеализовать 8 канальный шим
at90
сообщение May 11 2005, 13:59
Сообщение #1


Знающий
****

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



Люди как реализовать 8 канальный 8 битный программный шим для управления светодиодами на С. sad.gif


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
okela
сообщение May 11 2005, 14:47
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896



Цитата(at90 @ May 11 2005, 16:59)
Люди как реализовать 8 канальный 8 битный программный шим для управления светодиодами на С. sad.gif
*


Вобщем-то без разницы на каком языке реализовать этот алгоритм.
Если в общих чертах то это в моём представлении выглядит примерно так.

Пишется процедура прерывания для таймера работающего в автомате, который работает с частотой достаточной для заданной точности (fшим*256).
Объявляются 8 переменных, которые будут определять скважность по каждому каналу ШИМ (например в %). И каждая из этих переменных привязывается к одному биту какого-то 8-битного порта (для 50% пол-периода -0, пол-периода -1).
По каждому прерыванию таймера делается обновление информации выводимой в порт по всем разрядам.
Go to the top of the page
 
+Quote Post
at90
сообщение May 11 2005, 15:24
Сообщение #3


Знающий
****

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



Цитата(okela @ May 11 2005, 17:47)
Цитата(at90 @ May 11 2005, 16:59)
Люди как реализовать 8 канальный 8 битный программный шим для управления светодиодами на С. sad.gif
*


Вобщем-то без разницы на каком языке реализовать этот алгоритм.
Если в общих чертах то это в моём представлении выглядит примерно так.

Пишется процедура прерывания для таймера работающего в автомате, который работает с частотой достаточной для заданной точности (fшим*256).
Объявляются 8 переменных, которые будут определять скважность по каждому каналу ШИМ (например в %). И каждая из этих переменных привязывается к одному биту какого-то 8-битного порта (для 50% пол-периода -0, пол-периода -1).
По каждому прерыванию таймера делается обновление информации выводимой в порт по всем разрядам.
*


я так реализовал шим на 16 градаций
Сделал массив на 16 элементов
Каждый элемент массива выводил в порт за один тик тамера.
Изменяя биты изменял яркость.
Но на 256 делать массив на 256 -зто как то неразумно.
Слишком много уходит памяти


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
okela
сообщение May 12 2005, 12:10
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 165
Регистрация: 11-01-05
Из: Украина, г. Одесса
Пользователь №: 1 896



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


Имелось ввиду держать в памяти не массивы значений для каждого тика таймера, а char переменные для каждого канала, хранящих значения длительности импульса (паузы) для одного периода. Эти значения равны
числам переполнений таймера..... Как-то так. blush.gif
Go to the top of the page
 
+Quote Post
TMX
сообщение May 12 2005, 14:31
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



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; // установка выходного бита
}
Go to the top of the page
 
+Quote Post
at90
сообщение May 12 2005, 14:38
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 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;                  // установка выходного бита
}
*


А как мы задаём длительность каждого периода или у нас на выходе меандр?


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
MicronSys
сообщение May 12 2005, 14:41
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



Написал на скорую руку ( VMLAB + WinAvr + Atmega8 )

#include <avr\io.h> // Most basic include files
#include <avr\interrupt.h> // Add the necessary ones
#include <avr\signal.h> // here

unsigned char count=0x00;
unsigned char i[8];
unsigned char temp=0x00;
SIGNAL(SIG_OVERFLOW0)
{
count++;
if (count<i[0]) temp|=1;
else temp&=~1;
if (count<i[1]) temp|=2;
else temp&=~2;
if (count<i[2]) temp|=4;
else temp&=~4;
if (count<i[3]) temp|=8;
else temp&=~8;
if (count<i[4]) temp|=16;
else temp&=~16;
if (count<i[5]) temp|=32;
else temp&=~32;
if (count<i[6]) temp|=64;
else temp&=~64;
if (count<i[7]) temp|=128;
else temp&=~128;

PORTD=temp;
}


int main(void)
{
DDRD=0xFF; PORTD=0x00;
i[0]=0x00;
i[1]=0x10;
i[2]=0x20;
i[3]=0x30;
i[4]=0x40;
i[5]=0x50;
i[6]=0x60;
i[7]=0x70;
TCNT0=0x00; TCCR0=0x02; TIMSK|=(1<<TOIE0);
sei();
while(1)
{ // Infinite loop; define here the
asm("nop");
}

}
Go to the top of the page
 
+Quote Post
MicronSys
сообщение May 12 2005, 14:50
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



или так ( VMLAB 3.11 + WINAVR + ATMEGA8 )
#include <avr\io.h> // Most basic include files
#include <avr\interrupt.h> // Add the necessary ones
#include <avr\signal.h> // here

unsigned char count=0x00;
unsigned char i[8]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};
unsigned char temp=0x00;
unsigned char t=0x00;
SIGNAL(SIG_OVERFLOW0)
{
count++;
for(t=0;t<8;t++)
{
if (count<i[t]) temp|=(1<<t);
else temp&=~(1<<t);
}
PORTD=temp;
}


int main(void)
{
DDRD=0xFF; PORTD=0x00;
TCNT0=0x00; TCCR0=0x02; TIMSK|=(1<<TOIE0);
sei();
while(1)
{ // Infinite loop; define here the
asm("nop");
}

}
Go to the top of the page
 
+Quote Post
TMX
сообщение May 12 2005, 17:03
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



Цитата(at90 @ May 12 2005, 17:38)
[А как мы задаём длительность каждого периода или  у нас на выходе меандр?
*

Скважность на каждом выходе порта PWM_PORT зависит от содержимого элемента PWM_x. Получается управление по фазе. Попробуйте в симуляторе посмотреть.
Go to the top of the page
 
+Quote Post
TMX
сообщение May 12 2005, 17:10
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 19-01-05
Из: Москва
Пользователь №: 2 064



Цитата(MicronSys @ May 12 2005, 17:50)


А Вы бы не могли сравнить производительность трех приведенных кусков кода?
Время выполнения обработчика прерывания в тактах?
Go to the top of the page
 
+Quote Post
MicronSys
сообщение May 13 2005, 06:11
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



{

сount++;

for(t=0;t<8;t++)
if (count<i[t]) temp|=(1<<t);
else temp&=~(1<<t);

PORTD=temp;

}
Этот кусок кода при 1 Меге выполняется 0.51 ms
после компиляции в режиме оптимизации 0.38 ms
Go to the top of the page
 
+Quote Post
TMX
сообщение May 13 2005, 07:17
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 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 МГц будет вполне нормальный результат.
Go to the top of the page
 
+Quote Post
at90
сообщение May 18 2005, 03:50
Сообщение #13


Знающий
****

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



Перепробовал все куски кодов. Все работают нормально. Только чего хотел не получил!!!!!!!! Светодиод всё равно вспыхивает резковато. Изменение яркости видно лиш на половине интервала, потом изменение незаметно.
Светодио зелёный 6 кд. Чатоту прерывания взял как подсказали 12.5 кгц


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
sseett
сообщение May 18 2005, 04:07
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 165
Регистрация: 14-01-05
Из: РФ Приморский край (рег.25)
Пользователь №: 1 939



Так и должно быть, ведь яркость свечения не линейно зависит от протекающего через светодиод тока.
P.S.
Как-то делал ребенку елочную гирлянду (то же 8 каналов ШИМ) на сверхярких светодиодах и обнаружил, что использовать более 16 градаций уровня яркости не имеет смысла, изменение яркости практически не заметно.
Go to the top of the page
 
+Quote Post
at90
сообщение May 18 2005, 05:05
Сообщение #15


Знающий
****

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



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


Я поначалу тоже делал на 16 градаций но уменя получилось слишком ступенчатое изменение яркости,на 256 получьше


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 11:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016