Как масштабировать ШИМ рисующий полуволну синуса ?

Автомат, адаптивный автомат ... разум

Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение avr123.nm.ru » 12 янв 2009, 13:47

Как масштабировать (уменьшать) ШИМ рисующий полуволну синуса? Есть таблица синуса для рисования полуволны максимальной амплитуды - от 0 до 255. А надо вычислять ШИМ для произвольной амплитуды.

Прсто деление наверно долго по времени.

Есть хитрость скоростная в апноуте AVR447 - но ни как не въеду как там деление происходит. Алгоритм не понятен. Может прояснит кто ? Вот архив с исходниками на Си - http://slil.ru/26531077

PDF не нужен наверно, там толкование не внятное ИМХО, но если интересно то скачать можно в низу странички - http://avr123.nm.ru/07.htm

Добавлено спустя 1 час 4 минуты 38 секунд:
На Телесистемах посоветовали
Умножить на К амплитуды (0..255) и взять старший байт произведения
но хотелось бы понять как это ТАБЛИЧНО сделано в приложеном исходнике ??? там возможно на несколько чисел деление а не на произвольное число, но не могу понять как работает. В таблице деления в исходнике какие то числа - не пойму закономерность их.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение =DeaD= » 12 янв 2009, 15:55

А может кусок кода сюда выложить который из таблицы извлекает и результат даёт? А то там чего-то дофига всего смотреть.

Ну и таблицы...

А вообще деление на что-то делают всегда действительно более простыми операциями, - умножениями, сложениями, побитовыми сдвигами, взятием байт.

Умножалка то в AVR аппаратная?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение blindman » 12 янв 2009, 20:25

avr123.nm.ru писал(а):но хотелось бы понять как это ТАБЛИЧНО сделано в приложеном исходнике ???

Там не таблично сделано, а именно умножением
Код: Выделить всё
    //Scale sine modulation values to the current amplitude.
    tempU = ((uint16_t)(amplitude * tempU) >> 8);
    tempV = ((uint16_t)(amplitude * tempV) >> 8);
    tempW = ((uint16_t)(amplitude * tempW) >> 8);

умножение 8-битных чисел - дешевая операция, а сдвиг на 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: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение avr123.nm.ru » 12 янв 2009, 20:33

Спасибо. Т.е. в исходниках так как на Телесистемах и предлагали.

Я понял, что таблично там сделан выбор на сколько шагов двигаться по таблице синусоиды на больших оборотоах мотора.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение Duhas » 12 янв 2009, 20:39

авр, случаем не инвертор делаете?
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение Сергей » 12 янв 2009, 20:40

Вы бы кстати рассказали по подробнее о методе, интересно услышать "Как это работает" простым русским языком
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение avr123.nm.ru » 12 янв 2009, 20:49

Есть перевод AVR447 на русский язык - вот

Размер: 646.82 кб
http://stream.ifolder.ru/9993876

Там и осциллограммы хорошие.

=================
Делаю контроллер для BLDC мотора

=================
А вот во что преобразовал код умножения-сдвига CVAVR

Код: Выделить всё
;    2061
;    2062     //Scale sine modulation values to the current amplitude.
;    2063     tempU = ((unsigned int)(amplitude * tempU) >> 8);
   LDD  R30,Y+2
   LDS  R26,_amplitude
   MUL  R30,R26
   MOVW R30,R0
   LDI  R31,0
   MOV  R30,R31
   LDI  R31,0
   STD  Y+2,R30
;    2064     tempV = ((unsigned int)(amplitude * tempV) >> 8);
   LDD  R30,Y+1
   MUL  R30,R26
   MOVW R30,R0
   LDI  R31,0
   MOV  R30,R31
   LDI  R31,0
   STD  Y+1,R30
;    2065     tempW = ((unsigned int)(amplitude * tempW) >> 8);
   LD   R30,Y
   MUL  R30,R26
   MOVW R30,R0
   LDI  R31,0
   MOV  R30,R31
   LDI  R31,0
   ST   Y,R30
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение Duhas » 12 янв 2009, 20:59

на самом деле, если не требуется большого числа "масштабов" можно все сделать таблицей...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение kenaf » 23 мар 2009, 23:19

Сделал ШИМ синусоиды, посоветуйте как частоту синусоиды изменять? Ну например от 60 до 40 Гц.
Код: Выделить всё

unsigned char sin[]={0,2,3,5,7,8,10,12,13,15,
                     17,18,20,22,23,25,26,28,30,31,
                     33,34,36,38,39,41,42,44,46,47,
                     49,50,52,53,55,56,58,59,61,62,
                     63,65,66,68,69,71,72,73,75,76,
                     77,79,80,81,82,84,85,86,87,89,
                     90,91,92,93,94,95,97,98,99,100,
                     101,102,103,104,105,106,107,107,108,109,
                     110,111,112,112,113,114,115,115,116,117,
                     117,118,119,119,120,120,121,121,122,122,
                     123,123,123,124,124,125,125,125,125,126,
                     126,126,126,126,127,127,127,127,127,127,
                     127},
                     
                     i=0,
                     quarter=1;     

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (quarter==1){
                OCR0=(sin[i]+127);
                if (++i==120)quarter=2;
                }
if (quarter==2){
                OCR0=(sin[i]+127);
                if (--i==0)quarter=3;
               }
if (quarter==3){
                OCR0=(127-sin[i]);
                if (++i==120)quarter=4;
               }             
if (quarter==4){
                OCR0=(127-sin[i]);
                if (--i==0)quarter=1;
               }
}

// Declare your global variables here

void main(void)
{
TCCR0=0x61;
TCNT0=0x00;
OCR0=0x40;


осциллограмма http://slil.ru/27326870
kenaf
 
Сообщения: 4
Зарегистрирован: 23 мар 2009, 17:07
Откуда: Истра

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение avr123.nm.ru » 23 мар 2009, 23:28

Посмотрите в топике "исходники" пост 21 янв 2009 1:37 Ср - там пример и частота и амплитуда меняется.
viewtopic.php?f=2&t=3912
только в том топике нет обсуждения !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Как масштабировать ШИМ рисующий полуволну синуса ?

Сообщение kenaf » 26 мар 2009, 19:10

Спасибо, помогло.
kenaf
 
Сообщения: 4
Зарегистрирован: 23 мар 2009, 17:07
Откуда: Истра


Вернуться в Алгоритмы

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

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

cron