怎么用单片机产生脉宽可调的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的分频系数
}
另外,你想用其他方式控制舵机,我看不好办,因为它从中间转到最边缘需要的时间很短,你根本不能精确控制。激不尽。。
哥,我要占空比可调的啊,六十级左右的。。也就是六十档位的。。我有其他用处 展开
//定时器T2初始化
void timer2_init(void)
{
TCCR2 = 0x00;//停止定时器
ASSR = 0x00;//异步时钟模式
TCNT2 = 0x00;//初始值
OCR2 = 0x7F;//匹配值,该值的大小变化可以决定输出PWM的占空比(当然TCNT2一定的时候)
TIMSK |= 0x00;//中断允许
TCCR2 = 0x61;//启动定时器,此值可以决定PWM的分频系数
}
另外,你想用其他方式控制舵机,我看不好办,因为它从中间转到最边缘需要的时间很短,你根本不能精确控制。激不尽。。
哥,我要占空比可调的啊,六十级左右的。。也就是六十档位的。。我有其他用处 展开
3个回答
展开全部
以下是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--);
}
}
/*******************************************************
程序功能:用从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--);
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我也在研究~因为我的充电器上也要用这个~如果你学会了到时候告诉我!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询