
怎么用单片机产生脉宽可调的pwm信号
我买了个舵机,想用它带动一个云台作0到90度自由度的动作,但不知道如何实现,听别人说要用PWM信号控制舵机,怎么产生PWM信号啊?单片机吗?用什么单片机?什么程序?谁能告...
我买了个舵机,想用它带动一个云台作0到90度自由度的动作,但不知道如何实现,听别人说要用PWM信号控制舵机,怎么产生PWM信号啊?单片机吗?用什么单片机?什么程序?谁能告诉我,谢谢拥有令我羡慕知识的高手了!或者有没有其他的直接控制舵机的方法?
展开
4个回答
展开全部
单片机的T/C,定时/计数器就可以实现相位修正的PWM。当然,这都是要设置好寄存器的,51系列的可以,AVR的也可以,我用的是avr的给你一个小小的实例,单单是PWM的啊,你可以学一下:
//定时器T2初始化
void timer2_init(void)
{
TCCR2 = 0x00;//停止定时器
ASSR = 0x00;//异步时钟模式
TCNT2 = 0x00;//初始值
OCR2 = 0x7F;//匹配值,该值的大小变化可以决定输出PWM的占空比(当然TCNT2一定的时候)
TIMSK |= 0x00;//中断允许
TCCR2 = 0x61;//启动定时器,此值可以决定PWM的分频系数
}
另外,你想用其他方式控制舵机,我看不好办,因为它从中间转到最边缘需要的时间很短,你根本不能精确控制。
//定时器T2初始化
void timer2_init(void)
{
TCCR2 = 0x00;//停止定时器
ASSR = 0x00;//异步时钟模式
TCNT2 = 0x00;//初始值
OCR2 = 0x7F;//匹配值,该值的大小变化可以决定输出PWM的占空比(当然TCNT2一定的时候)
TIMSK |= 0x00;//中断允许
TCCR2 = 0x61;//启动定时器,此值可以决定PWM的分频系数
}
另外,你想用其他方式控制舵机,我看不好办,因为它从中间转到最边缘需要的时间很短,你根本不能精确控制。

2024-10-23 广告
深圳思驰科技是国内先进入芯片解密领域的公司,拥有数十年的丰富经验,成功帮助国内外企业、政府及知名科研机构攻克多个技术难题。在医疗电子、工控设备、军事航天、通信设备、广电设备、交通设备、汽车电子、家用电子等行业都成功推出了多款创新产品,熟悉这...
点击进入详情页
本回答由深圳思驰科技有限公司_提供
展开全部
推荐用51单片机,程序可以这样些:
ORG 00H
LJMP START
ORG 0BH ;以下是定时器中断子程序,产生pwm
CPL 21H.0 ;pwm状态标记位取反
JB 21H.0,OUT_H ;如果标记位为1,跳转到OUT_H段运行
OUT_L: ;否则
CLR P1.0 ;输出低电平
MOV TH0,20H ;将20h中数据传给th0
RETI ;中断返回
OUT_H: ;OUT_H段:
SETB P1.0 ;输出高电平
PUSH ACC ;将用到的ACC和PSW放入堆栈
PUSH PSW
CLR C ;清除进位位
MOV A,#0FFH ;用#0ffh减20h中的数据
SUBB A,20H
MOV TH0,A ;并将结果赋给TH0
POP PSW ;出栈
POP ACC
RETI ;中断返回
ORG 40H ;程序从40h开始
START: ;初始化:
MOV IE,#100000010B ;打开总中断开关和定时器0开关
MOV TMOD,#00000010B ;T0工作在定时器/方式2状态下
SETB TRO ;开定时器
LJMP LOOP ;跳转到主程序
LOOP: ;以下是主程序
......
MOV 20H,#30H ;传入要输出的电压
......
LJMP LOOP ;跳转到 主程序 ,形成循环
END ;程序结束
由于pwm输出值是放入th0中的,所以并不马上使用。直到下次中断时才被自动复制到tl0中开始递加计数。所以该方法不会因为中断子程序的运行时间较长而影响精度。但传入的值必须在30~225之间。目的是给中断子程序流出充足的运行时间,避免子程序未结束下一次中断就产生。
ORG 00H
LJMP START
ORG 0BH ;以下是定时器中断子程序,产生pwm
CPL 21H.0 ;pwm状态标记位取反
JB 21H.0,OUT_H ;如果标记位为1,跳转到OUT_H段运行
OUT_L: ;否则
CLR P1.0 ;输出低电平
MOV TH0,20H ;将20h中数据传给th0
RETI ;中断返回
OUT_H: ;OUT_H段:
SETB P1.0 ;输出高电平
PUSH ACC ;将用到的ACC和PSW放入堆栈
PUSH PSW
CLR C ;清除进位位
MOV A,#0FFH ;用#0ffh减20h中的数据
SUBB A,20H
MOV TH0,A ;并将结果赋给TH0
POP PSW ;出栈
POP ACC
RETI ;中断返回
ORG 40H ;程序从40h开始
START: ;初始化:
MOV IE,#100000010B ;打开总中断开关和定时器0开关
MOV TMOD,#00000010B ;T0工作在定时器/方式2状态下
SETB TRO ;开定时器
LJMP LOOP ;跳转到主程序
LOOP: ;以下是主程序
......
MOV 20H,#30H ;传入要输出的电压
......
LJMP LOOP ;跳转到 主程序 ,形成循环
END ;程序结束
由于pwm输出值是放入th0中的,所以并不马上使用。直到下次中断时才被自动复制到tl0中开始递加计数。所以该方法不会因为中断子程序的运行时间较长而影响精度。但传入的值必须在30~225之间。目的是给中断子程序流出充足的运行时间,避免子程序未结束下一次中断就产生。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
还在用51单片机模拟PWM,就没有直接的办法啦?AVR单片机可以直接产生PWM,比51简单多了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用Microchip啦,线路又简单,价钱又便宜,体积又小,编程也简单。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询