单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:1372|回复:1
打印上一主题下一主题

使用ATmega8单片机时钟8MHz控制舵机

[复制链接]
跳转到指定楼层
楼主
ID:342822发表于 2023-8-31 23:09|只看该作者|只看大图回帖奖励
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       ' 程序结束。

仿真如下:



沙发
ID:830831发表于 2023-9-2 13:24|只看该作者
BASCOM-AVR 对舵机的控制 不太达标,勉强可用

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网