求STC15W4K56S4 单片机输出pwm波控制电调的程序 51单片机输出pwm波程序
跪求单片机输出pwm波控制电调的程序!!
看你用什么单片机,有一些单片机有PWM功能,直接使能就可以了,不过51单片机好像都没有,但也可以用定时器做,精度也很高的,需要可以加我,我这里有一些资料,可以交流一下,多谢。
单片机输出pwm控制无刷电调,驱动无刷电机
单片机的驱动能力很小,驱动电流也只有几十毫安,所以要想驱动电机还必须加驱动电路,最简单地是用两个三极管做一个H桥电路,也可以用驱动芯片接成H桥电路,比如BTN7970或BTN7970等驱动芯片,用单片机控制三极管的基极或驱动芯片的相应引脚就能控制电机的正反转了。
STC15W4K32S4单片机怎么使用自带的PWM功能同时输出控制3个电机
/*任意周期和任意占空比DUTY%的PWM*/
#define CYCLE 6000L //定义PWM周期(最大值为32767)
sbit PWM2=P3^7;
sbit PWM3=P2^1;
sbit PWM4=P2^2;
void pwminit()
{ P_SW2 |= 0x80;
PWMCFG = 0x00; //配置PWM的输出初始电平为低电平
PWMCKS = 0x0f; //选择PWM的时钟为Fosc/(0+1)
PWMC = CYCLE; //设置PWM周期,定义PWM周期(最大值为32767)
PWM2CR = 0x00; //选择PWM2输出到P3.7,不使能PWM2中断
PWM3CR = 0x00;
PWM4CR = 0x00;
PWM2T1 = 0x0001;
PWM2T2 = 0;
PWM3T1 = 0x0001;
PWM3T2 = 0;
PWM4T1 = 0x0001;
PWM4T2 = 0;
PWMCR |= 0x80; //使能PWM模块
P_SW2 &=~0x80;
}
void pwm2( unsigned int DUTY) //PWM2
{
if(DUTY==0)
{
PWMCR &=~0x01;
PWM2=0;
}
else if (DUTY==100)
{
PWMCR &=~0x01;
PWM2=1;
}
else
{
P_SW2 |= 0x80; //使能访问PWM在扩展RAM区的特殊功能寄存器XSFR
PWM2T1 = 0x0001; //设置PWM2第1次反转的PWM计数
PWM2T2 = CYCLE * DUTY / 100; //设置PWM2第2次反转的PWM计数
P_SW2 &=~0x80; //占空比为(PWM2T2-PWM2T1)/PWMC
PWMCR |= 0x01; //使能PWM信号输出
}
}
void pwm3(unsigned int DUTY) //PWM3
{
if(DUTY==0)
{
PWMCR &=~0x02;
PWM3=0;
}
else if(DUTY==100)
{
PWMCR &=~0x02;
PWM3=1;
}
else
{
P_SW2 |= 0x80;
PWM3T1 = 0x0001;
PWM3T2 = CYCLE * DUTY / 100;
P_SW2 &=~0x80;
PWMCR |= 0x02;
}
}
void pwm4(unsigned int DUTY) //PWM4
{
if(DUTY==0)
{
PWMCR &=~0x04;
PWM4=0;
}
else if (DUTY==100)
{
PWMCR &=~0x04;
PWM4=1;
}
else
{
P_SW2 |= 0x80;
PWM4T1 = 0x0001;
PWM4T2 = CYCLE * DUTY / 100;
P_SW2 &=~0x80;
PWMCR |= 0x04;
}
}
求51单片机实现PWM的程序
#include <stc51.h>
int X ; // PWM的周期 单位:us微秒
int duty; //占空比变量
void main()
{
X=2000; //周期100uS 即PWM的频率=10KHZ
duty=50;//占空比 50%
TMOD=0X11;
EA=1;
ET0=1;
ET1=1;
TH0=(65535-duty)/256;//定时器0 改变占空比
TL0=(65535-duty)%256;
TH1=(65535-X)/256 ; //定时器1 改变频率
TL1=(65535-X)%256;
TR0=1;
TR1=1;
while(1) ;
}
void timer0_isr() interrupt 1 //定时器0;改变占空比
{
TR0=0;
P1=0X00;
++duty;
if(duty>=X-1) duty=1;
}
void timer1_isr() interrupt 3 //定时器1 ;改变PWM频率 即周期
{
P1=0XFF;
TH1=(65535-X)/256; //改变周期
TL1=(65535-X)%256;
TH0=(65535-duty)/256;//改变占空比
TL0=(65535-duty)%256;
TR0=1;
//TR1=1;
}