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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Как настроить PWM 100Гц если кварц 16МГц (Arduino Uno)


Как настроить PWM 100Гц если кварц 16МГц (Arduino Uno)

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

1

Всем привет!

Я пытаюсь на Arduino Uno (Mega328P) сделать шим 100 герц.
Нашел в интернете вот такую формулу для расчета частоты шим:   

Частота ШИМ = (частота кварца/предделитель) / (размер счетного регистра *2).

Кварц в ардуине 16 МГц. Подставлял все пердделители менял битность таймера, но ниже 122 герц сделать шим не получилось.
Граждане дорогие, помогите кто чем может. Вот мой простенький код:

Код:
$map                                                        ' Ïîëó÷àåì êàðòó ðàñïðåäåëåíèÿ ïàìÿòè

$regfile = "m328pdef.dat"
$crystal = 16000000

$framesize = 128                                            'ðàçìåð îáëàñòè èñïîëüçóåìîé è íåîáõîäèìîé äëÿ ïðåîáðàçîâàíèé
  $hwstack = 128                                            ' Ðàçìåð àïïàðàòíîãî ñòåêà
  $swstack = 128                                            ' Ðàçìåð ïðîãðàììíîãî ñòåêà


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


Config Adc = Single , Prescaler = 128 , Reference = Avcc
Dim R As Word
Dim R1 As Word
Dim R2 As Word
Dim W As Byte

Start Adc
Pwm1a = 0

Do
R = Getadc(0)
R1 = R / 4
W = R1

If R2 <> R1 Then
Pwm1a = W
R2 = R1
End If

Loop

End

0

2

Gipopotam написал(а):

Всем привет!

Я пытаюсь на Arduino Uno (Mega328P) сделать шим 100 герц.
Нашел в интернете вот такую формулу для расчета частоты шим:   

Частота ШИМ = (частота кварца/предделитель) / (размер счетного регистра *2).

Кварц в ардуине 16 МГц. Подставлял все пердделители менял битность таймера, но ниже 122 герц сделать шим не получилось.
Граждане дорогие, помогите кто чем может. Вот мой простенький код:

Ввести программный счётчик с пропуском через 1 -  уже поделили на 2. Затем подобрать значение старта Timer1:
Stop Timer1
Timer1= 400 ' как пример
Start Timer1
В таком случае таймер будет отсчитывать не полный цикл 65535.

0

3

Mrshilov написал(а):

При Pwm = 9 будет 61Гц.

Да спасибо я знаю, просто я неправильно изначально поставил вопрос. Мне нужно было ровно сто герц.

Tankor написал(а):

Ввести программный счётчик

Спасибо за подсказку.
У меня получилось вот так, может кому-то пригодится:

Код:
$map
$regfile = "m328pdef.dat"
$crystal = 16000000

$framesize = 128
  $hwstack = 128
  $swstack = 128

$baud = 19200


Config Pinb.1 = Output
Config Timer0 = Timer , Prescale = 1024

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

Dim A As Word
Dim B As Word
Dim Period As Word
Dim All_time As Word
Dim R As Word
Dim S As Word
Dim T As Byte
Dim T_print As Byte

Dim Flag As Bit

Start Adc
All_time = 65535
Period = 65535 - 460

Flag = 1

On Timer0 Pulse:

Enable Interrupts
Enable Timer0

Do

R = Getadc(0)
S = R / 4
T = S
If T < 55 Then
T = 55
End If

If T > 201 Then
T = 201
End If


A = Period + T
B = Period - T

If T_print <> T Then

 Print T
 T_print = T

 End If

Loop

Pulse:

  Toggle Portb.1
  Toggle Flag

If Flag = 1 Then

  Timer0 = A
  Else
   Timer0 = B
  End If

Return

End

0

4

Вообще из 16МГц, 100 получить можно: пред делитель 256, а дальше догоняем счетом до 625.
При 1024 выходит погрешность некислая.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Как настроить PWM 100Гц если кварц 16МГц (Arduino Uno)