怎么用单片机产生脉宽可调的pwm信号

给个程序参考,感激不尽。。下面这个ocr2应该有最大值的吧?30级的怎么算?//定时器T2初始化voidtimer2_init(void){TCCR2=0x00;//停止... 给个程序参考,感激不尽。。下面这个ocr2应该有最大值的吧?30级的怎么算?
//定时器T2初始化
void timer2_init(void)
{
TCCR2 = 0x00;//停止定时器
ASSR = 0x00;//异步时钟模式
TCNT2 = 0x00;//初始值
OCR2 = 0x7F;//匹配值,该值的大小变化可以决定输出PWM的占空比(当然TCNT2一定的时候)
TIMSK |= 0x00;//中断允许
TCCR2 = 0x61;//启动定时器,此值可以决定PWM的分频系数
}

另外,你想用其他方式控制舵机,我看不好办,因为它从中间转到最边缘需要的时间很短,你根本不能精确控制。激不尽。。
哥,我要占空比可调的啊,六十级左右的。。也就是六十档位的。。我有其他用处
展开
 我来答
maiwa478
2011-09-02 · TA获得超过319个赞
知道答主
回答量:259
采纳率:0%
帮助的人:170万
展开全部
单片机的T/C,定时/计数器就可以实现相位修正的PWM。当然,这都是要设置好AVR单片机可以直接产生PWM,比51简单多了! 用Microchip啦,线路又简单,
bylinwei163
2011-09-02 · TA获得超过245个赞
知道小有建树答主
回答量:194
采纳率:0%
帮助的人:162万
展开全部
以下是430单片机控制舵机的程序,我试验过,能用的,你可以参考一下:
/*******************************************************
程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁
P2.3口输出方波的占空比为75%
P2.4口输出方波的占空比为25%
-------------------------------------------------------
拨码开关设置:将LED位拨至ON,其余拨至OFF
测试说明:观察LED的亮灭的时间长短
*******************************************************/
#include <msp430x14x.h>

typedef unsigned char uchar;
typedef unsigned int uint;

uchar i;
void Delay400ms(void);
void moto(int speed);

void main(void)
{
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;

WDTCTL = WDTPW + WDTHOLD; // 关狗

/*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振

P2DIR = 0xff; // P2端口设置为输出
P2OUT = 0xff; // 关闭其他LED
P2SEL |= BIT3 + BIT4; // P2.3和P2.4连接内部模块
CCR0 = 20000-1; // PWM周期为20mS
CCTL1 = OUTMOD_7; // CCR1 reset/set
CCR1 =500; // 高电平宽度设置0.5ms
CCTL2 = OUTMOD_7; // CCR2 reset/set
CCR2 = 0; // CCR2 PWM duty cycle
TACTL = TASSEL_2 + ID_3 + MC_1; // ACLK/8, up mode

//_BIS_SR(LPM3_bits); // Enter LPM3

while(1)
{
moto(500);//0 = CCR1 = 500
Delay400ms();
Delay400ms();
Delay400ms();

moto(1167); //60
Delay400ms();
Delay400ms();
Delay400ms();

moto(1833); //120
Delay400ms();
Delay400ms();
Delay400ms();

moto(2500); //180
Delay400ms();
Delay400ms();
Delay400ms();

moto(1833); //120
Delay400ms();
Delay400ms();
Delay400ms();

moto(1167); //60
Delay400ms();
Delay400ms();
Delay400ms();

moto(500); //0
// moto(1167); //60
//moto(1833); //120
//moto(2500); //180
}

}
void moto(int speed)
{

CCR1=speed;

}

void Delay400ms(void)
{
uchar i=50;
uint j;

while(i--)
{
j=7269;
while(j--);
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
祖才漫3901
2011-09-02 · TA获得超过289个赞
知道答主
回答量:154
采纳率:0%
帮助的人:87.7万
展开全部
我也在研究~因为我的充电器上也要用这个~如果你学会了到时候告诉我!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式