rem Main.bas file generated by New Project wizard
rem
rem Created: 周三 8月 30 2023
rem Processor: ATmega8
rem Compiler: BASCOM-AVR
rem Write your code here
' 使用8MHz的ATmega8时钟来控制伺服电机。
' 信号周期=50Hz(20mS)
' 脉冲范围=1.5mS±0.5mS(1mS~2mS)
' 输出端口PB2
' (1)使用预分频器将时钟8MHz分频1/8。8,000,000 Hz÷8=1000,000 Hz
' (2) 使用比较器A[OCR1A]进行1/2500分频。1000,000Hz÷50Hz=20000计数-1
' (3)使用比较器B[OCR1B],将脉冲宽度从999到2000改变为1 mS到2 mS。
$regfile = "m8Def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 40
$framesize = 40
Config Portb.2 = Output ' 将脉冲输出端口OC1B设置为输出
Config Timer1 = Pwm , Prescale = 8 , Clear Timer = 1 , Compare B Pwm = Clear Up
Set Tccr1a.wgm11 '高速PWM模式。(TOP=OCR1A)
Set Tccr1b.wgm13 ' 高速PWM模式。(TOP=OCR1A)
Compare1a = 19999 ' 1000,000Hz÷50Hz=20000计数-1 (19999*1μS约等于20ms)
Dim a As Byte '循环计数
Dim pw_count As word ' 脉冲宽度计数。(初始值)1个计数为1μS。
' '
Do
'舵机跳跃式动作反复3次
do
incr a ' 每次循环计数 a=a+1
Compare1b = 1499 ' 脉冲宽度(0度时计数值)。1个计数为1μS。1*1499为伺服电机的中性位置——1.5mS
Wait 1
Compare1b = 1499+501 ' 脉冲宽度(+90度时计数值)。1个计数为1μS。1*20000为伺服电机的+90位置——2.0mS
Wait 1
Compare1b = 1499-500 ' 脉冲宽度(-90度时计数值)。1个计数为1μS。1*999为伺服电机的-90位置——1.0mS
Wait 1
loop until a=3 '3次后退出循环
a=0 '循环计数归零
'舵机缓慢增加或减少(+90度到-90度来回摆动)
For pw_count = 999 To 2000 ' 将脉冲宽度变化至1 mS至2 mS。
Compare1b = pw_count ' 设置脉冲宽度。
Waitms 5 ' 等待时间。
Next pw_count '
Waitms 500 '为看清显示设置的等待
For pw_count = 2000 To 999 Step -1 ' 脉冲宽度从2mS变化到1mS
Compare1b = pw_count ' 设置脉冲宽度。
Waitms 5 ' 等待时间。
Next pw_count '
Waitms 500 '为看清显示设置的等待
Loop '
End ' 程序结束。
仿真如下:
rem
rem Created: 周三 8月 30 2023
rem Processor: ATmega8
rem Compiler: BASCOM-AVR
rem Write your code here
' 使用8MHz的ATmega8时钟来控制伺服电机。
' 信号周期=50Hz(20mS)
' 脉冲范围=1.5mS±0.5mS(1mS~2mS)
' 输出端口PB2
' (1)使用预分频器将时钟8MHz分频1/8。8,000,000 Hz÷8=1000,000 Hz
' (2) 使用比较器A[OCR1A]进行1/2500分频。1000,000Hz÷50Hz=20000计数-1
' (3)使用比较器B[OCR1B],将脉冲宽度从999到2000改变为1 mS到2 mS。
$regfile = "m8Def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 40
$framesize = 40
Config Portb.2 = Output ' 将脉冲输出端口OC1B设置为输出
Config Timer1 = Pwm , Prescale = 8 , Clear Timer = 1 , Compare B Pwm = Clear Up
Set Tccr1a.wgm11 '高速PWM模式。(TOP=OCR1A)
Set Tccr1b.wgm13 ' 高速PWM模式。(TOP=OCR1A)
Compare1a = 19999 ' 1000,000Hz÷50Hz=20000计数-1 (19999*1μS约等于20ms)
Dim a As Byte '循环计数
Dim pw_count As word ' 脉冲宽度计数。(初始值)1个计数为1μS。
' '
Do
'舵机跳跃式动作反复3次
do
incr a ' 每次循环计数 a=a+1
Compare1b = 1499 ' 脉冲宽度(0度时计数值)。1个计数为1μS。1*1499为伺服电机的中性位置——1.5mS
Wait 1
Compare1b = 1499+501 ' 脉冲宽度(+90度时计数值)。1个计数为1μS。1*20000为伺服电机的+90位置——2.0mS
Wait 1
Compare1b = 1499-500 ' 脉冲宽度(-90度时计数值)。1个计数为1μS。1*999为伺服电机的-90位置——1.0mS
Wait 1
loop until a=3 '3次后退出循环
a=0 '循环计数归零
'舵机缓慢增加或减少(+90度到-90度来回摆动)
For pw_count = 999 To 2000 ' 将脉冲宽度变化至1 mS至2 mS。
Compare1b = pw_count ' 设置脉冲宽度。
Waitms 5 ' 等待时间。
Next pw_count '
Waitms 500 '为看清显示设置的等待
For pw_count = 2000 To 999 Step -1 ' 脉冲宽度从2mS变化到1mS
Compare1b = pw_count ' 设置脉冲宽度。
Waitms 5 ' 等待时间。
Next pw_count '
Waitms 500 '为看清显示设置的等待
Loop '
End ' 程序结束。
仿真如下: