ШИМ -> синус

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

ШИМ -> синус

Сообщение snayperAlfa » 19 апр 2009, 18:01

Вот такое дело. Есть АВР с частотой 9,6 МГц. Можно выбрать и 4,8 МГц. Это дело поправимое. Необходимо с помощью ШИМа сгенерить синус 50 Гц. Моделирую пока в Протеусе, используя мегу16. Потом надо бует перенести код на Тини13. Код я написал. Только вот точность никудышняя. Ну никак не получается 50 Гц. Решено было использовать 64 отсчета для синуса.

Код: Выделить всё
char mas[]={128,131,....,116,119,122,125}; //тут 256 значений для синуса

int i=0;
const int size=(sizeof(mas)/sizeof(char));
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
   if(i<=size-1){
    OCR0=mas[i];
    i+=4;
  }
  else(i=0);
}

void main(void)
{
DDRB.3=1;

TCNT0=0;
OCR0=0;

TCCR0=(0<<7 )| (1<<6) | (1<<5) | (1<<4) | (1<<3) | (0<<2) | (1<<1) | (1<<0);
TIMSK=(1<<0);

#asm("sei")
while (1)
      {      };
}


Вот скриншот из Протеуса. Красный синус это из генератора я завел - 50 Гц.
1.JPG
Протеус


prot.rar
Вот файл протеуса и прошивка
(12.76 КиБ) Скачиваний: 22

Подскажите плиз как бы этот синус на 50 Гц настроить :)
Последний раз редактировалось snayperAlfa 19 апр 2009, 19:23, всего редактировалось 1 раз.
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного

Re: ШИМ -> синус

Сообщение blindman » 19 апр 2009, 18:52

А почему в коде одно значение TCCR0, а в прошивке - другое?
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: ШИМ -> синус

Сообщение snayperAlfa » 19 апр 2009, 19:22

Забыл поменять
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного

Re: ШИМ -> синус

Сообщение blindman » 19 апр 2009, 21:10

Можно вот так сделать:


Код: Выделить всё
uint32_t phase = 0;
uint8_t next = 0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
    OCR0 = next;
    phase += 45812985;
    next = mas[phase >> 24];
}

На частоте кварца 9,6 МГц будет 50 Гц. Подробно как это работает можно почитать здесь: http://www.telesys.ru/electronics/projects.php?do=p035

Только правильно выставь предделитель таймера на 8
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: ШИМ -> синус

Сообщение snayperAlfa » 19 апр 2009, 22:31

Error: D:\Ìèêðîêîíòðîëåððû\Ïðîåêòû\Sinus with PWM\experimento.c(6): missing '('

Выдает ошибку когда хочу обьявить тип данных uint

Добавлено спустя 20 минут 23 секунды:
ХВАЛА ТЕБЕ blindman :good: :Bravo:
А я весь день бьюсь над этой задачей.
Заменил uint на unsigned long int
:good: :good: :Yahoo!:

Добавлено спустя 2 минуты 19 секунд:
Осталось понять что это за формула такая хитрая

Добавлено спустя 17 минут 22 секунды:
Теперь попробую перенести код на Тини13. По идее он ведь не должен сильно изменится?

Добавлено спустя 7 минут 21 секунду:
От я лопухнулся...
В протеусе оказывается есть ТИНИ13. Блин. Надо было сначала с нее и начинать. Ну нечего буду портировать код :D
snayperAlfa
 
Сообщения: 163
Зарегистрирован: 05 июн 2008, 22:03
Откуда: Украина,Одесса
прог. языки: С,Java,SQL если это язык,C++ немного


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11