找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1241|回复: 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        ' 程序结束。

仿真如下:
48.gif


回复

使用道具 举报

ID:830831 发表于 2023-9-2 13:24 | 显示全部楼层
BASCOM-AVR 对舵机的控制 不太达标,勉强可用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

快速回复 返回顶部 返回列表