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

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

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

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



PWM примеры

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

1

Примеры ШИМ, проверено на двух МК, всех из выходах и режимах.
Особенность: период - один регистр, заполнение - второй. Заполнение задается не в процентах, а в виде значения от первого регистра.
Т.е: Вы задали в регистре периода 40000, чтобы получить заполнение равное 50% во второй регистр пишите 20000.

PWM1p, на примере STC8H1K08

Код:
$regfile = "8H1K08.DAT"              ' STC registers list
$crystal = 5529600                   ' CPU clock frequence '11059200/2= 5529600
$large                               '

Dim Temp As Byte , Temp2 As Byte
Dim Temp_w As Word , Adc_dat As Word

'---------------------------------------------------------------------------------------

' Выходы P1
P1ie = 255                           ' 1: Enable digital pins
P1pu = 0                             ' 0= Disable pull-up resistor
P1m0 = 0 : P1m1 = 0                  ' pins mode

' Выходы P3
P3ie = 255                           ' 1: Enable digital pins
P3pu = 0                             ' 0= Disable pull-up resistor
P3m0 = 0 : P3m1 = 0                  ' pins mode

  P_sw2 = &H80                       ' EAXFR:Extended RAM SpecialFunctionRegister (XFR) access

  Pwma_ccer1 = 0 : Pwma_ccer2 = 0    ' FECC Ccerx Must Be Cleared  Before Writing To Ccmrx
  Pwma_ccmr1 = &H60                  ' FEC8 Set Cc1 To Pwma Output Mode1
  Pwma_ccer1 = 1                     ' FECC Enable Cc1 Channel

  Pwma_arrh = &H6 : Pwma_arrl = &HFF       ' FED2 FED3   Set Period Time
  Pwma_ccr1h = &H3 : Pwma_ccr1l = &HFF       ' FED5 FED6  Set Duty Cycle Time

  Pwma_eno = 0                       ' FEB1
  Pwma_eno = &B_0000_0011            ' FEB1 Enable Pwm1p Port Output

  Pwma_ps = 0                        ' FEB2
  Pwma_bkr = &H80                    ' FEDD Enable Main Output
  Pwma_cr1 = 1                       ' FEC0 Start Timing

  P_sw2.7 = 0

Do
 P3.2 = Not P3.2
 Waitms 150
Loop

PWM8, на примере STC8H1K28

Код:
$regfile = "8H1K28.DAT"              ' STC registers list
$crystal = 5529600                   ' CPU clock frequence '11059200/2= 5529600
$large                               '

Dim Temp As Byte , Temp2 As Byte
Dim Temp_w As Word , Adc_dat As Word

'---------------------------------------------------------------------------------------

' Выходы P0
P0ie = 255                           ' 1: Enable digital pins
P0pu = 0                             ' 0= Disable pull-up resistor
P0m0 = 0 : P0m1 = 0                  ' pins mode
' Выходы P1
P1ie = 255                           ' 1: Enable digital pins
P1pu = 0                             ' 0= Disable pull-up resistor
P1m0 = 0 : P1m1 = 0                  ' pins mode
' Выходы P2
P2ie = 255                           ' 1: Enable digital pins
P2pu = 0                             ' 0= Disable pull-up resistor
P2m0 = 0 : P2m1 = 0                  ' pins mode
' Выходы P3
P3ie = 255                           ' 1: Enable digital pins
P3pu = 0                             ' 0= Disable pull-up resistor
P3m0 = 0 : P3m1 = 0                  ' pins mode

 P_sw2 = &H80                        ' EAXFR:Extended RAM SpecialFunctionRegister (XFR) access

  Pwmb_ccer1 = 0 : Pwmb_ccer2 = 0    ' Ccerx Must Be Cleared  Before Writing To Ccmrx
  Pwmb_ccmr4 = &B_0110_0000          ' Set Cc8 To Mode "Pwm1"
  Pwmb_ccer2 = &B_0001_0000          ' Enable Cc8 Channel

  Pwmb_arrh = &H6 : Pwmb_arrl = &HFF       '   Set Period Time
  Pwmb_ccr8h = &H3 : Pwmb_ccr8l = &HFF       ' Set Duty Cycle Time

  Pwmb_eno = &B_0100_0000            ' Enable Pwm8 Port Output

  Pwmb_ps = 0                        '
'  Pwmb_ps = &B_10_00_0000             '

  Pwmb_bkr = &H80                    ' Enable Main Output
  Pwmb_cr1 = 1                       ' Start Timing

 P_sw2.7 = 0


Do
 P3.2 = Not P3.2
 Waitms 70
Loop

0

2

STC8H1K08. Немножко ШИМ на P5.4
Код:
$regfile = "8H1K08.DAT"
$crystal = 35000000
$ramsize = 1024
$map
$large


Dim Pwm54 As Byte


'НАСТРОЙКА ШИМ
' --- 1. Настройка физического порта ---
P5.4 = 0 : P5m1.4 = 0 : P5m0.4 = 1                            ' Настраиваем P5.4 на сильный выход (Push-Pull)

' --- 2. Включаем доступ к расширенным регистрам ШИМ (XFR) ---
P_sw2.7 = 1                                                ' Устанавливаем EAXFR = 1 (включает доступ к регистрам PWMB)

   ' --- 3. Перенаправляем канал PWM6 на пин P5.4 ---
   Pwmb_ps = &B0000_0100                                      ' Бит 2 (PWM6_PS) = 1 переключает PWM6 на порт P5.4

   ' --- 4. Настраиваем частоту и период (60 Гц, 8 бит) ---
   Pwmb_pscrh = 8                                             ' Задаем предделитель частоты = 2278
   Pwmb_pscrl = 230

   Pwmb_arrh = 0                                              ' Задаем период = 256 (в hex: &H0100)
   Pwmb_arrl = 255                                            ' Внимание: значение 0 в ARRL при ARRH=1 дает ровно 256

   ' --- 5. Настраиваем режим канала PWM6 (Прямой ШИМ, режим 1) ---
   Pwmb_ccmr2 = &B0110_0000                                   ' PWM6 в режиме PWM Mode 1 (выход активен, пока счетчик < заполнения)
   Pwmb_ccer1 = &B0001_0000                                   ' Разрешаем вывод сигнала для канала PWM6
   Pwmb_eno = &B0000_0100                                     ' Разрешаем выход ШИМ на физическую ногу порта
   Pwmb_bkr = &B1000_0000                                     ' Главное разрешение выхода ШИМ блока PWMB (Main Output Enable)

   ' --- 6. Запускаем счетчик ШИМ ---
   Pwmb_cr1.0 = 1                                             ' Включаем модуль PWMB (CEN = 1)

   ' --- 7. Закрываем доступ к расширенным регистрам (для безопасности) ---
P_sw2.7 = 0

Do

   P_sw2.7 = 1                                                ' 1. Открываем доступ к XFR-регистрам ШИМ
      Pwmb_ccr6h = 0                                          ' 2. Старший байт всегда 0 (так как ШИМ у нас 8-битный)
      Pwmb_ccr6l = pwm54                                   ' 3. Записываем ваше значение (0...255) в регистр сравнения 6-го канала
   P_sw2.7 = 0                                                ' 4. Закрываем доступ к XFR
   Waitms 10
   Incr  pwm54

Loop

Значение ШИМ задаётся байтом. Проверено на железке.

Отредактировано Кот Обормот (2026-08-10 22:04:55)

+1

3

Дёргаем ногой PЗ.4 с частотой 4 Гц
Код:
$regfile = "8H1K08.DAT"
$crystal = 11059200
$ramsize = 1024
$map
$large

P_sw2 = &H80
   P3m0.4 = 1:P3m1.4 = 0
   Pwma_ccer1 = 0
   Pwma_ccer2 = 0
   Pwma_ccmr4 = &H60
   Pwma_ccer2 = &H10
   Pwma_pscrh = 0
   Pwma_pscrl = 255
   Pwma_arrh = &H2A
   Pwma_arrl = &H2F
   Pwma_ccr4h = &H15
   Pwma_ccr4l = &H18
   Pwma_eno = &H40
   Pwma_ps = &HC0
   Pwma_bkr = &H80
   Pwma_cr1 = 1
P_sw2.7 = 0
Do
Loop

Проверено в железке

Отредактировано Кот Обормот (2026-09-07 23:04:37)

0