#define __PWM__H__
void pwm_ccp1(unsigned char a,unsigned char b)
void pwm_ccp2(unsigned char a,unsigned char b)
#endif
void pwm_ccp1(unsigned char a,unsigned char b)//左边PWM
//CCP1 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值)=b+1 us //pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)
//pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)
{//a>b时有最高转速
CCPR1L=a //* 设置工作循环的高 8bit 为 a
CCP1CON=0X0C //0000 1100 设置 CCP1 为 PWM 工作方式,且工作循环的低 bit2 为 11*/
CCP1IE=0//* 禁止总中断和外围中断 */
PR2=b //* 设置 PWM 周期 */
TRISC2=0 //* 设置 RC2/CCP1 为输出 */
T2CON=0X04 //* 0000 1000前分频比为 1:1 ,后分频器1:2,打开 TMR2 ,同时输出 PWM 信号 */
}
void pwm_ccp2(unsigned char a,unsigned char b) //右边PWM
//CCP2 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值),
//pwm高电平=a:CCP2CON(第四五位)Tosc*(TMR2前分频值)
{
CCPR2L=a //* 设置工作循环的高 8bit 为 a
CCP2CON=0X0C //* 设置 CCP2 为 PWM 工作方式,且工作循环的低 bit2 为 11*/
CCP2IE=0 //* 中断屏蔽
PR2=b //* 设置 PWM 周期 */
TRISC1=0 //* 设置 RC1/CCP2 为输出 */
T2CON=0X04 //* 前分频比为 1 ,打开 TMR2 ,同时输出 PWM 信号 */
}
/*s52,12M晶振,P30输出PWM,P10按键控制输出*/#include<reg52.h>
sbit control=P1^0
sbit pwm=P3^0
void delay()
{
unsigned char i,j
for(i=0i<10i++)
for(j=0j<112j++)
}
main()
{
unsigned char flag=1
TMOD=0x02//定时器0方式2自动载入;
TH0=0xe3//28us定时,即28us翻转一次;周期为56us,频率约为18K
TL0=0xe3
EA=1
ET0=1
TR0=1
while(1)
{
if(control==0)
{
delay()
if(control==0)
{
flag=~flag
switch(flag)
{
case 0:TR0=0EA=0pwm=0
break
case 1:EA=1TR0=1
}
}
}while(control==0)
}
}
void timer0()interrupt 1
{
pwm=~pwm
}
用带PWM输出的单片机做吧!51单片机只能通过定时器来实现。想12C2052AD这些单片机就带PWM输出的。他的PWM输出程序:
#include<reg52.h>
sfr CCON =0xD8
sfr CMOD=0xD9
sfr CL=0xE9
sfr CH =0xF9
sfr CCAP0L=0xEA
sfr CCAP0H=0xFA
sfr CCAPM0=0xDA
sfr CCAPM1=0xDB
sbit CR =0xDE
void main(void)
{
CMOD = 0X02//
CL =0X00//
CH =0X00//
CCAP0L = 0xc0//设置初值
CCAP0H= 0xc0//输出占空比为25%的波形
CCAPM0 = 0x42//PWM的输出模式
CR =1 ;启动PCA定时器
while(1){};
}
上面是输出PWM的程序,你把PWM输出端接到你的舵机控制端,再启动PCA就OK了,改变CCAP0的值就可以改变占空比
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)