Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Как зделать синусоидальный ШИМ?


Как зделать синусоидальный ШИМ?

Сообщений 1 страница 30 из 128

1

Доброго времени суток.
Часто спрашиват можно зделать однофазный преобразователь для асинхронного двигателя. Очень нужная тема у кого дровяной отопительный котел. Системы с самоциркуляцией не изпользуют, дорого. По этому неоходимо ставить циркуляционный насос. Если пропадает электричество вода в котле закипает, и последствия печальные.
Пробовали ставить безперебойники от компьютера. Можно убить насос. Они на выходе формируют прямоуольник. Для импульсных блоков питания нормуль, хоть постоянка. Аснхронные движки сильно греються.
Накидал код, но толком ничего с синусом не выходит. Чем больше пересчетов в прерывании, тем меньше частота модуляции. С треугольной формой бм. Можно получить 50Гц.

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000                                          
$hwstack = 160
$swstack = 160
$framesize = 64

'==========================================================================================================
Config Timer1 = Pwm, Pwm = 8, Compare A Pwm = Clear Up, Compare B Pwm = Clear Up, Prescale = 8

Config Timer0 = Timer , Prescale = 1                       '
On Timer0 Pila                                              ' обзываем прерывание
'**********************************************************************************************************
Config PORTB.1 = Output
Config PORTB.2 = Output

'==========================================================================================================
Dim K As Bit
Dim T As Bit               'Формирование треугольника фазы
Dim U As Byte              'Пила фазы
Dim SinU As Single         'Формирование Sin фазы
Dim Uout As Byte           'Управление ШИМ фазы формы Sin

 Const S = 0.00616          'Константа (Пи/2)/255
Dim Hz As Word : Hz = 200
'==========================================================================================================
Enable Interrupts                                           ' разрешаем все прерывания
Enable Timer0
'**********************************************************************************************************
Do

   SinU = U * S
   SinU = Sin(SinU)
   SinU = SinU * 255
   Uout = SinU


 Loop
End
'==========================================================================================================
 Pila:
  Timer0 = Hz

   If T = 0 Then Incr U
   If U = 252 Then T = 1
   If T = 1 Then Decr U
   If U = 3 Then
     T = 0
     Toggle K
   End If

   If K = 0 Then
    Pwm1b = 0
    Pwm1a = U'out
   End If

   If K = 1 Then
    Pwm1a = 0
    Pwm1b = U'out
   End If

 Return

0

2

Не подойдет ? ;)
» Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Синусоида на AVR.

Отредактировано Nord (2019-03-01 22:21:45)

0

3

Nord
Тема не та, но интересная. Жаль все файлы удалены.
Мне нужен ШИМ модулированный синусом.http://sh.uploads.ru/t/sFtp2.jpg
На картинках треугольником.
http://s3.uploads.ru/t/8Jl4y.jpg

Отредактировано rom-i (2019-03-01 22:55:41)

0

4

По таблице делайте, это экономит ресурсы, 16кгц вытягивает АВР как, можно и больше.

0

5

rom-i написал(а):

Тема не та, но интересная. Жаль все файлы удалены.

Упс...  o.O
Такие факты не проверял...

В любом случае - покопайтесь там же, этот раздел просто кладезь информации.
Спасибо Александру !
Есть еще в его параллельных разделах многое.

Точно помню - где-то было ваше искомое ! ;)
Ищите про хлебопекарню... ;)

Отредактировано Nord (2019-03-01 23:57:31)

0

6

Nord
Про аналоговую синусоиду нашел. Автор перенес ее под название генераторы синусоидальной формы, а файлы переложил на яндекс диск. Но это на будущее. Хочу разобраться с этой темой.
Стало интересно почему так таймер тормозиться если в прерывание добавлять функции.
Если по моей программе предустановка TIMER0=200, Config Timer0 = Timer , Prescale = 1, частота 16мГц.
Прерывание должно быть 56/16000000=35мкС, или 285714Гц.
Добавил в прерывание Toggle PORTB.0, что бы реально замерить период. Должно получиться полный период F=285714/2=142857Гц. В реале получаю 41760Гц.
Если добавить в прерывание пересчет треугольника в синус(в коде перекинул в основной цикл, что бы не комментить) частота уменьшается до 3125Гц. Если брать нужное для создания треугольника ето еще 249+249=498 переполнений таймера. 3125/498=6Гц.
Писать таблицу Case из 255 строк как предлогает Yuriy.pv. И в конце не получить нужного результата, очень грустно.

0

7

rom-i написал(а):

Мне нужен ШИМ модулированный синусом.
(Вчера 21:55:41)

Здесь

делаете таблицу синуса и вперёд с транспарантом.

+1

8

sasha_1973
Скачивал пораньше эту тему. Интересный код. Много для мну непонятного(вставки ассемблера). На баском только учусь. Но это совем не то, что надо. Формирование треугольника для ШИМ в главном цикле. Это, и есть нужная для меня часть формирующая выходной сигнал. В моем случае 50Гц. Не зря пытаюсь затолкать это в прерывание(привязаться к частоте МК).
В главном цикле много еще чего будет. Контроль сети. Переключение на автономное питание от этого преобразователя, и наоборот. Контроль температур. Передача аварийных переходов по SIM800l, и обратный контроль. Частота работы главного цикла вообще будет не стабильна.

0

9

если синус то Вам сюды, аппаратное формирование синуса

чистый синус

'===============================================================================
'*
'*  Автор: Sasha_1973
'*  Дата:  18.12.2013 г.
'*
'*  МК:  ATmega328P
'*  Тактовая частота МК:  7,3728 MГц
'*
'*  Скорость передачи USART: 460800 бод
'*
'*  Компилятор: BASCOM-AVR 2.0.7.1
'*  Используемый шрифт в Bascom: Consolas; размер = 14
'*
'*  Программа симулятор: Proteus 7.10 SR0
'*
'*  Описание: 3 синусоиды (аппроксимация = 252 точки), смещённые по фазе на 120° + 6 АЦП (режим Free) + USART (скорость трансляции = 460800 бод) + Atmega328P
'*
'===============================================================================

  $map       ' Получаем карту распределения памяти

  $regfile = "m328Pdef.dat"       ' Используемый контроллер

'  $crystal = 7372800       ' 7,3728 МГц, кварц для стабильной работы USART во всём диапазоне скоростей передачи и приёма

  $crystal = 18432000       ' 18,432 МГц, кварц для стабильной работы USART во всём диапазоне скоростей передачи и приёма

  $framesize = 32       'размер области используемой и необходимой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека
  $baud = 230400       '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000    '230400

  Ucsr0a.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

'----------------------  Настройка TIMER1  -------------------------------------

  Config Timer1 = Timer , Clear Timer = 1 , Prescale = 1

  On Compare1a Обработка_прерывания_compare1a Nosave

  Stop Timer1

'----------------------  Настройка TIMER0  -------------------------------------

  Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

  Stop Timer0

'----------------------  Настройка TIMER2  -------------------------------------

  Config Timer2 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

  Stop Timer2

'----------  Конфигурация АЦП, измерения проходят в фоновом режиме  ------------

'  Config Adc = Free , Prescaler = 128 , Reference = Avcc

  Admux = &B01000000

  Adcsra = &B11001111

  Adcsrb = &B0000000

  On Adc Обработка_прерывания_ацп Nosave

'-------------------  Используемые переменные  ---------------------------------

  Dim Цикл_print As Byte
  Dim Цикл_значение_синуса As Byte

'-------  Для генератора 3-х фазной синусоиды, фазы смещены на 120°  -----------

  Dim 1_фаза As Byte
  Dim 2_фаза As Byte
  Dim 3_фаза As Byte

  Dim Значение_синуса(253) As Byte

  Dim Значение_синуса_1_фаза As Byte
  Dim Значение_синуса_2_фаза As Byte
  Dim Значение_синуса_3_фаза As Byte

'-------------  Для 6-ти каналов АЦП  ------------------------------------------

  Dim Данные_ацп(6) As Word
  Dim Temp_данные_ацп As Word
  Dim Сырые_данные_ацп(2) As Byte At Temp_данные_ацп Overlay

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

'------------------  Запуск и предварительные настройки  -----------------------

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

'------  Закидываем значения выводимой синусоиды из таблицы в оперативку  ------

  For Цикл_значение_синуса = 0 To 251
      Значение_синуса(цикл_значение_синуса + 1) = Lookup(цикл_значение_синуса , Таблица_синуса_252)
  Next Цикл_значение_синуса

'------  Делаем смещение фаз на 120°  ------------------------------------------

  Значение_синуса_1_фаза = 0       ' 1 фаза
  Значение_синуса_2_фаза = 84       ' 2 фаза
  Значение_синуса_3_фаза = 168       ' 3 фаза

'Для 252 точек. Значение для получения частоты 50,00 Гц, при частоте кварца 7,3728 Мгц

'  Compare1a = 580

  Compare1a = 1462

'------  Запускаем аппаратные средства контроллера  ----------------------------

'  Start Adc
  Start Timer0
  Start Timer1
  Start Timer2

'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

'--------------  Разрешаем работу необходимых прерываний  ----------------------

'  Enable Adc
  Enable Compare1a

'------------  Разрешаем работу всех включенных прерываний  --------------------

  Enable Interrupts

'Ждём первого измерения АЦП, последующие измерения происходят в фоновом режиме

'  Power Adcnoise

'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л

'===============================================================================
  Главный_цикл:

    nop

    For Цикл_print = 1 To 6
        Print "Тест АЦП " ; Цикл_print ; ": " ; Данные_ацп(цикл_print)
    Next Цикл_print

    Print

    Waitms 20

  Goto Главный_цикл
End
'===============================================================================

'                        П О Д П Р О Г Р А М М Ы

'===============================================================================

'===============================================================================
  Обработка_прерывания_compare1a:
'-------------------------------------------------------------------------------
nop
'------  Сохраняем используемые регистры и SREG  -------

    !push R26
    !in R26 , sreg
    !push r26

    !push R10
    !push R11
    !push R27
    !push R30
    !push R31

'------  Высчитываем выводимое значение синуса для 1 фазы -------

     !lds R26 , {Значение_синуса_1_фаза}
     !inc R26

'-----  Исключаем переполнение счетчиков значений синуса, для 252 точек  -------

     !cpi R26 , &HFC       ' десатичное = 252, двоичное = &B11111100
     !BRLO Выход_значение_синуса_1_фаза       ' Перейти если меньше
     !Lds R26 , 1       ' Если равно или больше закидываем в регистр "1"
    Выход_значение_синуса_1_фаза:
     !sts {Значение_синуса_1_фаза} , R26       ' Пишем значение регистра в переменную

'------  Забираем значение синуса из массива, всего 252 значения  -------

     Loadadr Значение_синуса(значение_синуса_1_фаза + 1) , Z

     !ld R26 , Z       ' Забираем текущее значение синуса из массива в регистр

'------  Закидываем полученное значение в регистр таймера  -------

     !out Ocr0a , R26

'------  Высчитываем выводимое значение синуса для 2 фазы -------

     !lds R26 , {Значение_синуса_2_фаза}
     !inc R26

'-----  Исключаем переполнение счетчиков значений синуса, для 252 точек  -------

     !cpi R26 , &HFC       ' десатичное = 252, двоичное = &B11111100,
     !BRLO Выход_значение_синуса_2_фаза       ' Перейти если меньше
     !lds R26 , 1       ' Если равно или больше закидываем в регистр "1"
    Выход_значение_синуса_2_фаза:
     !sts {Значение_синуса_2_фаза} , R26       ' Пишем значение регистра в переменную

'------  Забираем значение синуса из массива, всего 252 значения  -------

     Loadadr Значение_синуса(значение_синуса_2_фаза + 1) , Z

     !ld R26 , Z       ' Забираем текущее значение синуса из массива в регистр

'------  Закидываем полученное значение в регистр таймера  -------

     !out Ocr0b , R26

'------  Высчитываем выводимое значение синуса для 3 фазы -------

     !lds R26 , {Значение_синуса_3_фаза}
     !inc R26

'-----  Исключаем переполнение счетчиков значений синуса, для 252 точек  -------

     !cpi R26 , &HFC       ' десатичное = 252, двоичное = &B11111100,
     !BRLO Выход_значение_синуса_3_фаза       ' Перейти если меньше
     !lds R26 , 1       ' Если равно или больше закидываем в регистр "1"
    Выход_значение_синуса_3_фаза:
     !sts {Значение_синуса_3_фаза} , R26       ' Пишем значение регистра в переменную

'------  Забираем значение синуса из массива, всего 252 значения  -------

     Loadadr Значение_синуса(значение_синуса_3_фаза + 1) , Z

     !ld R26 , Z       ' Забираем текущее значение синуса из массива в регистр

'------  Закидываем полученное значение в регистр таймера  -------

     !out Ocr2b , R26

'------  Восстанавливаем ранее сохранённые регистры и SREG  -------

    !pop R31
    !pop R30
    !pop R27
    !pop R11
    !pop R10

    !pop R26
    !Out Sreg , R26
    !pop R26

'------  Выходим из прерывания  -------

    !reti
nop
'-------------------------------------------------------------------------------
  Return
'===============================================================================


'===============================================================================
  Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
nop
'------  Сохраняем используемые регистры и SREG  -------

    !push R24
    !in R24 , sreg
    !push r24

    !push R25
    !push R26
    !push R27

'----  Выключаем прерывание от АЦП  ----

    !in R25 , adcsra       ' Читаем значение, время выполнения инструкции - 1 такт
    !CBR R25 , &B00001000       ' Сбросить бит в регистре, время выполнения инструкции - 1 такт
    !out Adcsra , R25       ' Пишем значение, время выполнения инструкции - 1 такт

'----  Забираем данные из регистров АЦП  ----

    !in R26 , adcl
    !sts {Сырые_данные_ацп(1)} , R26

    !in R26 , adch
    !sts {Сырые_данные_ацп(2)} , R26

'------  Готовим следующий канал АЦП  -------

    !in R26 , ADMUX       ' Читаем ADMUX
    !ANDI R26 , &H07       ' Маской отрезаем лишние биты. Получаем номер канала
    !inc R26       ' Делаем ADMUX = ADMUX + 1
    !ANDI R26 , &H07       ' Маской отрезаем лишние биты. Получаем следующий номер канала

    !cpi R26 , 6       ' Проверяем номер канала
    !BRLO Выбор_входа_ацп       ' Перейти если меньше
    !ldi R26 , 0

   Выбор_входа_ацп:

    !IN R27 , ADMUX       ' Читаем ADMUX
    !ANDI R27 , &HF8       ' Маской отрезаем биты номера канала, получаем настройку АЦП
    !OR R27 , R26       ' Склеили текущие настройки АЦП c новым значением номера канала, т.е., сделали MUX = MUX + 1
    !OUT ADMUX , R27       ' Закидываем полученное значение в регистр АЦП

'------  Забираем готовые данные АЦП в массив  -------

    !cpi R26 , 0
    !BREQ Ацп_0       ' (BREQ) Если равно перейти на метку, время выполнения 2 такта, если не равно 1 такт

    !cpi R26 , 1
    !BREQ Ацп_1       ' (BREQ) Если равно перейти на метку, время выполнения 2 такта, если не равно 1 такт

    !cpi R26 , 2
    !BREQ Ацп_2       ' (BREQ) Если равно перейти на метку, время выполнения 2 такта, если не равно 1 такт

    !cpi R26 , 3
    !BREQ Ацп_3       ' (BREQ) Если равно перейти на метку, время выполнения 2 такта, если не равно 1 такт

    !cpi R26 , 4
    !BREQ Ацп_4       ' (BREQ) Если равно перейти на метку, время выполнения 2 такта, если не равно 1 такт

    !cpi R26 , 5
    !BREQ Ацп_5       ' (BREQ) Если равно перейти на метку, время выполнения 2 такта, если не равно 1 такт

   Ацп_0:
    Данные_ацп(6) = Temp_данные_ацп
    !rjmp Запуск_ацп

   Ацп_1:
    Данные_ацп(1) = Temp_данные_ацп
    !rjmp Запуск_ацп

   Ацп_2:
    Данные_ацп(2) = Temp_данные_ацп
    !rjmp Запуск_ацп

   Ацп_3:
    Данные_ацп(3) = Temp_данные_ацп
    !rjmp Запуск_ацп

   Ацп_4:
    Данные_ацп(4) = Temp_данные_ацп
    !rjmp Запуск_ацп

   Ацп_5:
    Данные_ацп(5) = Temp_данные_ацп
    !rjmp Запуск_ацп

'----  Включаем прерывание от АЦП  ----
   Запуск_ацп:

    !in R25 , adcsra       ' Читаем значение, время выполнения инструкции - 1 такт
    !SBR R25 , &B01001000       ' Установить бит в регистре, время выполнения инструкции - 1 такт
    !out Adcsra , R25       ' Пишем значение, время выполнения инструкции - 1 такт

'------  Восстанавливаем ранее сохранённые регистры и SREG  -------

    !pop R27
    !pop R26
    !pop R25

    !pop R24
    !Out Sreg , R24
    !pop R24

'------  Выходим из прерывания  -------
nop
    !reti

'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Таблица_синуса_252:       ' 252 значения синусоиды
'-------------------------------------------------------------------------------
    Data &H7E , &H82 , &H85 , &H88 , &H8B , &H8E , &H91 , &H94 , &H97 , &H9B
    Data &H9E , &HA1 , &HA4 , &HA7 , &HAA , &HAD , &HAF , &HB2 , &HB5 , &HB8
    Data &HBB , &HBD , &HC0 , &HC3 , &HC5 , &HC8 , &HCB , &HCD , &HCF , &HD2
    Data &HD4 , &HD6 , &HD9 , &HDB , &HDD , &HDF , &HE1 , &HE3 , &HE5 , &HE7
    Data &HE8 , &HEA , &HEC , &HED , &HEF , &HF0 , &HF1 , &HF3 , &HF4 , &HF5
    Data &HF6 , &HF7 , &HF8 , &HF9 , &HF9 , &HFA , &HFB , &HFB , &HFC , &HFC
    Data &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFB
    Data &HFB , &HFA , &HF9 , &HF9 , &HF8 , &HF7 , &HF6 , &HF5 , &HF4 , &HF3
    Data &HF1 , &HF0 , &HEF , &HED , &HEC , &HEA , &HE8 , &HE7 , &HE5 , &HE3
    Data &HE1 , &HDF , &HDD , &HDB , &HD9 , &HD6 , &HD4 , &HD2 , &HCF , &HCD
    Data &HCB , &HC8 , &HC5 , &HC3 , &HC0 , &HBD , &HBB , &HB8 , &HB5 , &HB2
    Data &HAF , &HAD , &HAA , &HA7 , &HA4 , &HA1 , &H9E , &H9B , &H97 , &H94
    Data &H91 , &H8E , &H8B , &H88 , &H85 , &H82 , &H7E , &H7B , &H78 , &H75
    Data &H72 , &H6F , &H6C , &H69 , &H66 , &H62 , &H5F , &H5C , &H59 , &H56
    Data &H53 , &H50 , &H4E , &H4B , &H48 , &H45 , &H42 , &H40 , &H3D , &H3A
    Data &H38 , &H35 , &H32 , &H30 , &H2E , &H2B , &H29 , &H27 , &H24 , &H22
    Data &H20 , &H1E , &H1C , &H1A , &H18 , &H16 , &H15 , &H13 , &H11 , &H10
    Data &H0E , &H0D , &H0C , &H0A , &H09 , &H08 , &H07 , &H06 , &H05 , &H04
    Data &H04 , &H03 , &H02 , &H02 , &H01 , &H01 , &H01 , &H01 , &H01 , &H00
    Data &H01 , &H01 , &H01 , &H01 , &H01 , &H02 , &H02 , &H03 , &H04 , &H04
    Data &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0C , &H0D , &H0E , &H10
    Data &H11 , &H13 , &H15 , &H16 , &H18 , &H1A , &H1C , &H1E , &H20 , &H22
    Data &H24 , &H27 , &H29 , &H2B , &H2E , &H30 , &H32 , &H35 , &H38 , &H3A
    Data &H3D , &H3F , &H42 , &H45 , &H48 , &H4B , &H4E , &H50 , &H53 , &H56
    Data &H59 , &H5C , &H5F , &H62 , &H66 , &H69 , &H6C , &H6F , &H72 , &H75
    Data &H78 , &H7B , &H7E
'===============================================================================

0

10

Архив закинул Вам на мыло

0

11

sasha_1973
Эту тему нашел ночью после работы. Скачал, но не успел посмотреть.  o.O На Ваших программах точно не научусь.))) Это не для первоклассника. Голый АСМ.

Таблица от 0 до 252.
У мну получиться:
Uout = Lookup(u , Таблица_синуса_252)

0

12

rom-i написал(а):

Таблица от 0 до 252.
У мну получиться:
Uout = Lookup(u , Таблица_синуса_252)


Прям в десятку !

А на счёт ASM, так собственно макс. скорость, при минимальных затратах.

0

13

sasha_1973
Чет таблица не срослась.

Код:
 Pila:
  Timer0 = Hz
   Toggle Portb.0

   If T = 0 Then Incr U
   If U = 252 Then T = 1
   If T = 1 Then Decr U
   If U = 0 Then
     T = 0
     Toggle K
   End If

   Uout = Lookup(u , Таблица_синуса_252)

   If K = 0 Then
    Pwm1b = 0
    Pwm1a = Uout
   End If

   If K = 1 Then
    Pwm1a = 0
    Pwm1b = Uout
   End If

 Return
'===============================================================================
  Таблица_синуса_252:                                       ' 252 значения синусоиды
'-------------------------------------------------------------------------------
    Data &H7E , &H82 , &H85 , &H88 , &H8B , &H8E , &H91 , &H94 , &H97 , &H9B
    Data &H9E , &HA1 , &HA4 , &HA7 , &HAA , &HAD , &HAF , &HB2 , &HB5 , &HB8
    Data &HBB , &HBD , &HC0 , &HC3 , &HC5 , &HC8 , &HCB , &HCD , &HCF , &HD2
    Data &HD4 , &HD6 , &HD9 , &HDB , &HDD , &HDF , &HE1 , &HE3 , &HE5 , &HE7
    Data &HE8 , &HEA , &HEC , &HED , &HEF , &HF0 , &HF1 , &HF3 , &HF4 , &HF5
    Data &HF6 , &HF7 , &HF8 , &HF9 , &HF9 , &HFA , &HFB , &HFB , &HFC , &HFC
    Data &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFB
    Data &HFB , &HFA , &HF9 , &HF9 , &HF8 , &HF7 , &HF6 , &HF5 , &HF4 , &HF3
    Data &HF1 , &HF0 , &HEF , &HED , &HEC , &HEA , &HE8 , &HE7 , &HE5 , &HE3
    Data &HE1 , &HDF , &HDD , &HDB , &HD9 , &HD6 , &HD4 , &HD2 , &HCF , &HCD
    Data &HCB , &HC8 , &HC5 , &HC3 , &HC0 , &HBD , &HBB , &HB8 , &HB5 , &HB2
    Data &HAF , &HAD , &HAA , &HA7 , &HA4 , &HA1 , &H9E , &H9B , &H97 , &H94
    Data &H91 , &H8E , &H8B , &H88 , &H85 , &H82 , &H7E , &H7B , &H78 , &H75
    Data &H72 , &H6F , &H6C , &H69 , &H66 , &H62 , &H5F , &H5C , &H59 , &H56
    Data &H53 , &H50 , &H4E , &H4B , &H48 , &H45 , &H42 , &H40 , &H3D , &H3A
    Data &H38 , &H35 , &H32 , &H30 , &H2E , &H2B , &H29 , &H27 , &H24 , &H22
    Data &H20 , &H1E , &H1C , &H1A , &H18 , &H16 , &H15 , &H13 , &H11 , &H10
    Data &H0E , &H0D , &H0C , &H0A , &H09 , &H08 , &H07 , &H06 , &H05 , &H04
    Data &H04 , &H03 , &H02 , &H02 , &H01 , &H01 , &H01 , &H01 , &H01 , &H00
    Data &H01 , &H01 , &H01 , &H01 , &H01 , &H02 , &H02 , &H03 , &H04 , &H04
    Data &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0C , &H0D , &H0E , &H10
    Data &H11 , &H13 , &H15 , &H16 , &H18 , &H1A , &H1C , &H1E , &H20 , &H22
    Data &H24 , &H27 , &H29 , &H2B , &H2E , &H30 , &H32 , &H35 , &H38 , &H3A
    Data &H3D , &H3F , &H42 , &H45 , &H48 , &H4B , &H4E , &H50 , &H53 , &H56
    Data &H59 , &H5C , &H5F , &H62 , &H66 , &H69 , &H6C , &H6F , &H72 , &H75
    Data &H78 , &H7B , &H7E
'=====================================================

http://s3.uploads.ru/t/YNK4w.jpg
Но движение по теме есть. Максимальная частота 75Гц. Таймер не до конца принижен.)))

0

14

весь исходник ?

0

15

Думаю все нормально. На баском по другому не сделать. Нужно писать свою таблицу.

0

16

sasha_1973
Нет. Исходник в начале поста. Это только прерывание.

0

17

Здесь то, что Вам надо

+1

18

Частоту под себя подправите.

+1

19

sasha_1973
Гораздно лучьше. Спасибо. Переносить таблицу в ОЗУ, для пердыша узнать, очень здорово.
Перенес в свою программу. Получилась максимальная частота 250Гц. Осталось разбить на два полупериода.

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000                                         'для уменьшения энергопотребления
$hwstack = 160
$swstack = 160
$framesize = 64

'==========================================================================================================
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Config Timer0 = Timer , Prescale = 8                        '
On Timer0 Pila                                              ' обзываем прерывание
'**********************************************************************************************************
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output


'-------  Для генератора 3-х фазной синусоиды, фазы смещены на 120°  -----------

  Dim 1_фаза As Byte
  Dim Цикл_значение_синуса As Word
  Dim Значение_синуса(252) As Byte

'------------------  Запуск и предварительные настройки  -----------------------
'------  Закидываем значения выводимой синусоиды из таблицы в оперативку  ------

  For Цикл_значение_синуса = 1 To 252
      Значение_синуса(цикл_значение_синуса) = Lookup(цикл_значение_синуса , Таблица_синуса_252)
  Next Цикл_значение_синуса
'==========================================================================================================
Dim K As Bit
Dim T As Bit                                                'Формирование треугольника фазы
Dim U As Byte                                               'Пила фазы
Dim Sinu As Single                                          'Формирование Sin фазы
Dim Uout As Byte                                            'Управление ШИМ фазы формы Sin

 Const S = 0.00616                                          'Константа (Пи/2)/255
Dim Hz As Word : Hz = 200
'==========================================================================================================
Enable Interrupts                                           ' разрешаем все прерывания
Enable Timer0
'**********************************************************************************************************
Do

 Loop
End
'==========================================================================================================
 Pila:
  Timer0 = Hz
  Toggle Portb.0
    Incr U                                                  ' Высчитываем выводимое значение синуса для 1 фазы
    If U > 252 Then U = 1                                   ' Исключаем переполнение счетчиков значений синуса, для 252 точек
    Ocr1a = Значение_синуса(u)                              ' Забираем значение синуса из массива, всего 252 значения в регистр таймера 0
'-------------------------------------------------------------------------------
  Return
'===============================================================================


'===============================================================================
  Таблица_синуса_252:                                       ' 252 значения синусоиды
'-------------------------------------------------------------------------------
    Data &H7E , &H82 , &H85 , &H88 , &H8B , &H8E , &H91 , &H94 , &H97 , &H9B
    Data &H9E , &HA1 , &HA4 , &HA7 , &HAA , &HAD , &HAF , &HB2 , &HB5 , &HB8
    Data &HBB , &HBD , &HC0 , &HC3 , &HC5 , &HC8 , &HCB , &HCD , &HCF , &HD2
    Data &HD4 , &HD6 , &HD9 , &HDB , &HDD , &HDF , &HE1 , &HE3 , &HE5 , &HE7
    Data &HE8 , &HEA , &HEC , &HED , &HEF , &HF0 , &HF1 , &HF3 , &HF4 , &HF5
    Data &HF6 , &HF7 , &HF8 , &HF9 , &HF9 , &HFA , &HFB , &HFB , &HFC , &HFC
    Data &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFB
    Data &HFB , &HFA , &HF9 , &HF9 , &HF8 , &HF7 , &HF6 , &HF5 , &HF4 , &HF3
    Data &HF1 , &HF0 , &HEF , &HED , &HEC , &HEA , &HE8 , &HE7 , &HE5 , &HE3
    Data &HE1 , &HDF , &HDD , &HDB , &HD9 , &HD6 , &HD4 , &HD2 , &HCF , &HCD
    Data &HCB , &HC8 , &HC5 , &HC3 , &HC0 , &HBD , &HBB , &HB8 , &HB5 , &HB2
    Data &HAF , &HAD , &HAA , &HA7 , &HA4 , &HA1 , &H9E , &H9B , &H97 , &H94
    Data &H91 , &H8E , &H8B , &H88 , &H85 , &H82 , &H7E , &H7B , &H78 , &H75
    Data &H72 , &H6F , &H6C , &H69 , &H66 , &H62 , &H5F , &H5C , &H59 , &H56
    Data &H53 , &H50 , &H4E , &H4B , &H48 , &H45 , &H42 , &H40 , &H3D , &H3A
    Data &H38 , &H35 , &H32 , &H30 , &H2E , &H2B , &H29 , &H27 , &H24 , &H22
    Data &H20 , &H1E , &H1C , &H1A , &H18 , &H16 , &H15 , &H13 , &H11 , &H10
    Data &H0E , &H0D , &H0C , &H0A , &H09 , &H08 , &H07 , &H06 , &H05 , &H04
    Data &H04 , &H03 , &H02 , &H02 , &H01 , &H01 , &H01 , &H01 , &H01 , &H00
    Data &H01 , &H01 , &H01 , &H01 , &H01 , &H02 , &H02 , &H03 , &H04 , &H04
    Data &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0C , &H0D , &H0E , &H10
    Data &H11 , &H13 , &H15 , &H16 , &H18 , &H1A , &H1C , &H1E , &H20 , &H22
    Data &H24 , &H27 , &H29 , &H2B , &H2E , &H30 , &H32 , &H35 , &H38 , &H3A
    Data &H3D , &H3F , &H42 , &H45 , &H48 , &H4B , &H4E , &H50 , &H53 , &H56
    Data &H59 , &H5C , &H5F , &H62 , &H66 , &H69 , &H6C , &H6F , &H72 , &H75
    Data &H78 , &H7B , &H7E
'===============================================================================

на частоте примерно 75Гц
http://s8.uploads.ru/t/bMfBQ.jpg

Отредактировано rom-i (2019-03-02 15:50:25)

0

20

Полупериод не сделать. Делает как в посте 13. Начало таблицы, добавляется в конце.

0

21

Делайте таблицу полупериода и переключайтесь,  таблицу можно до 127 сократить или меньше, ещё ресурсы освободите, в реальном устройстве столько не нужно.

0

22

Yuriy.pv
Таблицу использую Александра. Отлично работает. Но только раскомментировать деление на полупериоды, получается начало, в конце.

Код:
$regfile = "m328pdef.dat"
$crystal = 16000000                                         'для уменьшения энергопотребления
$hwstack = 160
$swstack = 160
$framesize = 64

'==========================================================================================================
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Config Timer0 = Timer , Prescale = 8                        '
On Timer0 Pila                                              ' обзываем прерывание
'**********************************************************************************************************
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output


'-------  Для генератора 3-х фазной синусоиды, фазы смещены на 120°  -----------

  Dim 1_фаза As Byte
  Dim Цикл_значение_синуса As Word
  Dim Значение_синуса(252) As Byte

'------------------  Запуск и предварительные настройки  -----------------------
'------  Закидываем значения выводимой синусоиды из таблицы в оперативку  ------

  For Цикл_значение_синуса = 1 To 252
      Значение_синуса(цикл_значение_синуса) = Lookup(цикл_значение_синуса , Таблица_синуса_252)
  Next Цикл_значение_синуса
'==========================================================================================================
Dim K As Bit
Dim T As Bit                                                'Формирование треугольника фазы
Dim U As Byte                                               'Пила фазы
Dim Sinu As Single                                          'Формирование Sin фазы
Dim Uout As Byte                                            'Управление ШИМ фазы формы Sin

 Const S = 0.00616                                          'Константа (Пи/2)/255
Dim Hz As Word : Hz = 200
'==========================================================================================================
Enable Interrupts                                           ' разрешаем все прерывания
Enable Timer0
'**********************************************************************************************************
Do

 Loop
End
'==========================================================================================================
 Pila:
  Timer0 = Hz
  Toggle Portb.0
    Incr U                                                  ' Высчитываем выводимое значение синуса для 1 фазы
    If U > 252 Then                                         ' Исключаем переполнение счетчиков значений синуса, для 252 точек
       Toggle K
       U = 1
    End If

'  If K = 0 Then                                             ' Забираем значение синуса из массива, всего 252 значения в регистр таймера 0
    Ocr1a = Значение_синуса(u)
    Ocr1b = 0
'  End If

'  If K = 1 Then                                             ' Забираем значение синуса из массива, всего 252 значения в регистр таймера 0
'    Ocr1b = Значение_синуса(u)
'    Ocr1a = 0
'  End If
'-------------------------------------------------------------------------------
  Return
'===============================================================================


'===============================================================================
  Таблица_синуса_252:                                       ' 252 значения синусоиды
'-------------------------------------------------------------------------------
    Data &H7E , &H82 , &H85 , &H88 , &H8B , &H8E , &H91 , &H94 , &H97 , &H9B
    Data &H9E , &HA1 , &HA4 , &HA7 , &HAA , &HAD , &HAF , &HB2 , &HB5 , &HB8
    Data &HBB , &HBD , &HC0 , &HC3 , &HC5 , &HC8 , &HCB , &HCD , &HCF , &HD2
    Data &HD4 , &HD6 , &HD9 , &HDB , &HDD , &HDF , &HE1 , &HE3 , &HE5 , &HE7
    Data &HE8 , &HEA , &HEC , &HED , &HEF , &HF0 , &HF1 , &HF3 , &HF4 , &HF5
    Data &HF6 , &HF7 , &HF8 , &HF9 , &HF9 , &HFA , &HFB , &HFB , &HFC , &HFC
    Data &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFC , &HFB
    Data &HFB , &HFA , &HF9 , &HF9 , &HF8 , &HF7 , &HF6 , &HF5 , &HF4 , &HF3
    Data &HF1 , &HF0 , &HEF , &HED , &HEC , &HEA , &HE8 , &HE7 , &HE5 , &HE3
    Data &HE1 , &HDF , &HDD , &HDB , &HD9 , &HD6 , &HD4 , &HD2 , &HCF , &HCD
    Data &HCB , &HC8 , &HC5 , &HC3 , &HC0 , &HBD , &HBB , &HB8 , &HB5 , &HB2
    Data &HAF , &HAD , &HAA , &HA7 , &HA4 , &HA1 , &H9E , &H9B , &H97 , &H94
    Data &H91 , &H8E , &H8B , &H88 , &H85 , &H82 , &H7E , &H7B , &H78 , &H75
    Data &H72 , &H6F , &H6C , &H69 , &H66 , &H62 , &H5F , &H5C , &H59 , &H56
    Data &H53 , &H50 , &H4E , &H4B , &H48 , &H45 , &H42 , &H40 , &H3D , &H3A
    Data &H38 , &H35 , &H32 , &H30 , &H2E , &H2B , &H29 , &H27 , &H24 , &H22
    Data &H20 , &H1E , &H1C , &H1A , &H18 , &H16 , &H15 , &H13 , &H11 , &H10
    Data &H0E , &H0D , &H0C , &H0A , &H09 , &H08 , &H07 , &H06 , &H05 , &H04
    Data &H04 , &H03 , &H02 , &H02 , &H01 , &H01 , &H01 , &H01 , &H01 , &H00
    Data &H01 , &H01 , &H01 , &H01 , &H01 , &H02 , &H02 , &H03 , &H04 , &H04
    Data &H05 , &H06 , &H07 , &H08 , &H09 , &H0A , &H0C , &H0D , &H0E , &H10
    Data &H11 , &H13 , &H15 , &H16 , &H18 , &H1A , &H1C , &H1E , &H20 , &H22
    Data &H24 , &H27 , &H29 , &H2B , &H2E , &H30 , &H32 , &H35 , &H38 , &H3A
    Data &H3D , &H3F , &H42 , &H45 , &H48 , &H4B , &H4E , &H50 , &H53 , &H56
    Data &H59 , &H5C , &H5F , &H62 , &H66 , &H69 , &H6C , &H6F , &H72 , &H75
    Data &H78 , &H7B , &H7E
'===============================================================================

Вот так.
http://sd.uploads.ru/t/QTAGq.jpg

Отредактировано rom-i (2019-03-02 19:13:32)

0

23

rom-i написал(а):

Но только раскомментировать деление на полупериоды, получается начало, в конце.

Перечитал раз восемь...  :dontknow:
Расшифруйте, плиз... ;)

0

24

Извиняюсь. Переключение произходит на 2mS позже. Так правильнее.

0

25

Nord
Спецом, для Вас!!!

Код:
'==========================================================================================================
 Pila:
  Timer0 = Hz
  Toggle Portb.0
    Incr U                                                  ' Высчитываем выводимое значение синуса для 1 фазы
    If U > 252 Then                                         ' Исключаем переполнение счетчиков значений синуса, для 252 точек
       Toggle K
       U = 1
    End If

'  If K = 0 Then                                             ' Забираем значение синуса из массива, всего 252 значения в регистр таймера 0
    Ocr1a = Значение_синуса(u)
    Ocr1b = 0
'  End If

'  If K = 1 Then                                             ' Забираем значение синуса из массива, всего 252 значения в регистр таймера 0
'    Ocr1b = Значение_синуса(u)
'    Ocr1a = 0
'  End If
'-------------------------------------------------------------------------------
  Return

0

26

МК на кварце или на внутреннем RC ?

В коде:
$crystal = 16000000

В железе что ?

0

27

Nord
Не обижайтесь. Но поставлю "-". За баню.

+1

28

rom-i написал(а):

Осталось разбить на два полупериода


В смысле ?

0

29

sasha_1973
Упраление выходными ключами. В мостовом режиме. Для начала драйвер пойдет, потом IJBT. По теме моща махонькая нужна. Мона Ампер на 30 STGIPS воткнуть. Дело техники.

0

30

типа такого

http://s8.uploads.ru/t/APTly.jpg

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Как зделать синусоидальный ШИМ?