这是利用L298驱动两个直流电机的(来源于智能车循迹)程序,/* =======直流电机的PWM速度控制程序======== */
/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
#include&ltreg51.h&gt
#include&ltmath.h&gt
#define uchar unsigned char
#define uint unsigned int
sbit en1=P1^0/* L298的Enable A */
sbit en2=P1^1/* L298的Enable B */
sbit s1=P1^2/* L298的Input 1 */
sbit s2=P1^3/* L298的Input 2 */
sbit s3=P1^4/* L298的Input 3 */
sbit s4=P1^5/* L298的Input 4 */
uchar t=0/* 中断计数器 */
uchar m1=0/* 电机1速度值 */
uchar m2=0/* 电机2速度值 */
uchar tmp1,tmp2/* 电机当前速度值 */
/* 电机控制函数 index-电机号(1,2)speed-电机速度(-100—100) */
void motor(uchar index, char speed)
{
if(speed&gt=-100 &amp&ampspeed&lt=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed)/* 取速度的绝对值 */
if(speed&lt0) /* 速度值为负则反转 */
{
s1=0
s2=1
}
else /* 不为负数则正转 */
{
s1=1
s2=0
}
}
if(index==2) /* 电机2的处理 */
{
m2=abs(speed)/* 电机2的速度控制 */
if(speed&lt0) /* 电机2的方向控制 */
{
s3=0
s4=1
}
else
{
s3=1
s4=0
}
}
}
}
void delay(uint j) /* 简易延时函数 */
{
for(jj&gt0j--)
}
void main()
{
uchar i
TMOD=0x02/* 设定T0的工作模式为2 */
TH0=0x9B/* 装入定时器的初值 */
TL0=0x9B
EA=1/* 开中断 */
ET0=1/* 定时器0允许中断 */
TR0=1/* 启动定时器0 */
while(1) /* 电机实际控制演示 */
{
for(i=0i&lt=100i++) /* 正转加速 */
{
motor(1,i)
motor(2,i)
delay(5000)
}
for(i=100i&gt0i--) /* 正转减速 */
{
motor(1,i)
motor(2,i)
delay(5000)
}
for(i=0i&lt=100i++) /* 反转加速 */
{
motor(1,-i)
motor(2,-i)
delay(5000)
}
for(i=100i&gt0i--) /* 反转减速 */
{
motor(1,-i)
motor(2,-i)
delay(5000)
}
}
}
void timer0() interrupt 1 /* T0中断服务程序 */
{
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1
tmp2=m2
}
if(t&lttmp1) en1=1else en1=0/* 产生电机1的PWM信号 */
if(t&lttmp2) en2=1else en2=0/* 产生电机2的PWM信号 */
t++
if(t&gt=100) t=0/* 1个PWM信号由100次中断产生 */
调节占空比就是调节下面的ZKB1的值,此处是1~1000的范围,要调节此值可以在while里面加点语句。#include<reg51.h>
typedef unsigned char unchar
typedef unsigned char unint
#define V_TH0 0XFF //调节 V_TH0 和V_TL0的值即调节周期
#define V_TL00X81
#define V_TMOD 0X01
sbit P1_0 = P1^0
/************************主函数********************/
unchar ZKB1 //调节
main()
{
//ZKB1=11 /*占空比初始值设定8 18 1ms 32*/
//ZKB2=18 /*占空比初始值设1.5y定*/
init_sys()
while(1)
{ }
}
/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void)/*系统初始化函数*/
{
/*定时器初始化*/
TMOD=V_TMOD
TH0=V_TH0
TL0=V_TL0
ZKB1=20
// TR0=0
// ET0=0
// EA=0
TR0=1
ET0=1
EA=1
}
/*中断函数*/
void timer0(void) interrupt 1 using 2
{
static unchar click=0 /*中断次数计数器变量*/
TH0=V_TH0 /*恢复定时器初始值*/
TL0=V_TL0
++click
if (click>=1000) click=0
if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_0=1
else
P1_0=0
}
有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:#include<reg51.h>
unsigned char pwhh,pwhl,pwlh,pwll
bit flag
sbit pwm=P1^0
void t0isr() interrupt 1
{
if(flag)
{
TH0=pwhh
TL0=pwhl
}
else
{
TH0=pwlh
TL0=pwll
}
pwm=~pwm
}
main()
{
TMOD=0x01
pwhh=(65536-1000)/256
pwhl=(65536-1000)%256
pwlh=(65536-500)/256
pwll=(65536-500)%256
TH0=pwhh
L0=pwhl
TR0=1
ET0=1
EA=1
while(1)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)