Синус на avr

Обсуждаем контроллеры компании Atmel.
Ответить
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Синус на avr

Сообщение Minasmorgul »

Колдую на генератором синуса с помощью шим. Ситуация следующая, необходимо чтобы один пин формировал одну полуволну, а другой другую (скрин)
Вроде бы что-то получилось, но то что хотелось бы. Получается некое слишком медленное затухание.
Частота - 100 гц.
Таблицу синуса считал по Y=254*(SIN(2*3,14*X/128)) т.е. разрешение синуса 128.

Фильтр посчитал на 100 Гц.

Код: Выделить всё

#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>

int i1sin=0, testOCR2;
int chec=0;

unsigned int sin[]={0,12,25,37,50,62,74,86,97,109,120,131,141,151,161,171,180,188,196,204,211,218,224,230,235,239,243,246,\
249,251,253,254,254,254,253,251,249,246,243,239,235,230,224,218,211,204,197,188,180,171,161,152,141,131,120,109,98,86,\
74,62,50,38,25,13,0,12,24,37,49,61,73,85,97,108,119,130,141,151,161,170,179,188,196,204,211,218,224,229,234,239,243,\
246,249,251,253,254,254,254,253,251,249,247,243,239,235,230,224,218,212,204,197,189,180,171,162,152,142,131,120,109,\
98,86,74,62,50,38,26,13,1};

int main(void)
{
//************** настройка портов*******
DDRB|=(1«0);
DDRB|=(1«1);

//*************настройка T1************

TCCR1B|=(1«CS10)|(1«WGM12);
OCR1AH=0x02;
OCR1AL=0x71;
TCNT1=0x00;
TIMSK|=(1«OCIE1A);

//**************** настройка T2***************
TCCR2|=(1«WGM21)|(1«CS20)|(1«WGM20);
TIMSK|=(1«OCIE2)|(1«TOIE2);
TCNT2=0x00;

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

}

}

ISR(TIMER1_COMPA_vect)
{
OCR2=255-sin[i1sin];
i1sin++;
if (i1sin>127) i1sin=0;
}

ISR(TIMER2_COMP_vect)
{
if (i1sin<=64)
{
PORTB|=(1«0);
}

if (i1sin>64)
{
PORTB|=(1«1);
}

}

ISR(TIMER2_OVF_vect)
{

if (i1sin<=64)
{
PORTB&=~(1«0);
}

if (i1sin>64)
{
PORTB&=~(1«1);
}

}
Как добиться большего затухания (нужен более остроконечный максимум) и чтобы максимум полуволны оказывался в центре пакета шим?
Как добиться такого как на первом скрине?
Вложения
bNtKMXEmodo.jpg
(90.49 КБ) 795 скачиваний
KTRUY8p_mV0.jpg
(193.64 КБ) 494 скачивания
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Синус на avr

Сообщение uk8amk »

Очевидно, что частоту ФНЧ необходимо повышать. Вместо R1-R2 поставьте потенциометры и подберите их значение для получения приемлемой картинки.
Реклама
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: Синус на avr

Сообщение Minasmorgul »

т.е. с кодом все правильно?
Мне непонятна ситуация с амплитудой. Как только я увеличиваю в формуле синуса амплитуду до 250 и чего-то близкого, как у меня получается два пика. В чем может быть проблема?
Как мне добиться амплитуды в 5 вольт?
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Синус на avr

Сообщение akl »

По мне, Вы с арифметикой запутались. По выражению Y=254*(SIN(2*3,14*X/128)) получается 128 точек на период синуса. Ваша таблица содержит почему-то 129 точек и в окрестности максимума калькулятор винды даёт такие значения
30 точка - 252
31 точка - 253
32 точка - 254
33 точка - 253
34 точка - 252, которые ну никак не вяжутся с Вашими ...,251,253,254,254,254,...
По мне, логичнее записать
OCR1AH=(F_CPU/100/128/256-1)
OCR1AL=(F_CPU/100/128-1)
Касательно фильтра. Частота среза должна быть 1600 Гц, чтобы амплитудные искажения не превышали 1%.
Реклама
Эиком - электронные компоненты и радиодетали
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: Синус на avr

Сообщение Minasmorgul »

которые ну никак не вяжутся с Вашими ...,251,253,254,254,254,...
почему же? Стандартное округление в большую сторону дает серию
30 - 251
31 - 253
32 - 254
33 - 254
34 - 254
35 - 253
OCR1AL=(F_CPU/100/128-1)
А как это? Поясните. У меня частота кварца 8 Мгц у меня не получится воткнуть в OCR1AL 16битное значение
Реклама
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Синус на avr

Сообщение akl »

Насчёт округления. По мне, существует только один способ округления, который даёт
30-252,77...~253
31-253,69...~254
32-254
33-253,69...~254
34-252,77...~253, что тоже не совпадает с Вашей таблицей.
akl писал(а):OCR1AH=(F_CPU/100/128/256-1)
OCR1AL=(F_CPU/100/128-1)
Эти операторы должны, по идее, загрузить старший байт числа в OCR1AH, а младший байт числа в OCR1AL.
Реклама
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: Синус на avr

Сообщение Minasmorgul »

Вогнал таблицу с округленными значениями

Код: Выделить всё

unsigned int sin[]={0,12,25,37,50,62,74,86,97,109,120,131,141,151,161,171,180,188,196,204,211,	218,224,230,235,239,243,246,249,251,253,254,254,254,253,251,249,246,243,239,235,230,224,218,211,204,197,188,180,171,161,152,141,131,120,109,98,86,74,62,50,38,25,13,0,12,24,37,49,61,73,85,97,108,119,130,141,151,161,170,179,188,	196,204,211,218,224,229,234,239,243,246,249,251,253,254,254,254,253,251,249,247,243,239,235,230,224,218,212,204,197,189,180,171,162,152,142,131,120,109,98,86,74,62,50,38,26,13};
вогнал
OCR1AH=(F_CPU/100/128/256-1)
OCR1AL=(F_CPU/100/128-1)

в результате: теже самые грабли. В чем проблема может быть?

Изображение
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Синус на avr

Сообщение akl »

Возможно, таймер не может корректно отработать максимальное значение 254 единицы. Вот здесь работа ведется только по одному таймеру Т1 и снизу и сверху есть защитные интервалы, заведомо предотвращающие срыв генерации ШИМа.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Синус на avr

Сообщение YS »

Таблицу синуса считал по Y=254*(SIN(2*3,14*X/128))
Гм. А вы сознательно не сдвинули синус на 128 вверх (чтобы не было отрицательных значений), или просто забыли? А так, если это один байт, вы еще и в переполнение влетаете, т.к. синус получается от -254 до 254.

По-хорошему синус при разрядности 8 бит считать надо как 128 + 127*sin((2*M_PI*n)/N).
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Re: Синус на avr

Сообщение Mishany »

ТС, нарисуй что хочешь в итоге получить, график?
А зачем в массиве повтор? там достаточно одну полуволну забить, и при переходе через ноль менять ноги.
Minasmorgul
Родился
Сообщения: 17
Зарегистрирован: Сб фев 07, 2015 20:21:27

Re: Синус на avr

Сообщение Minasmorgul »

YS
А вы сознательно не сдвинули синус на 128 вверх
мне необходимы чтобы две лапы мк формировали синус: одна - одну полуволну, другая - другую. А зачем мне сдвигать, если я могу взять кусок массива? Я что-то не пойму вашего поста.

Mishany
Вот что я хочу в идеале Изображение
Насчет перехода через ноль, мне так показалось проще.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Синус на avr

Сообщение YS »

Гм-гм, ну, если вы используете только одну полуволну, то оно, наверное, и необязательно...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Ответить

Вернуться в «AVR»