标题: L298N驱动实例 [打印本页]
作者: 11dong37026 时间: 2017-4-23 09:14
标题: L298N驱动实例
(1)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit INPUT1 = P1^0; //控制口
sbit INPUT2 = P1^1;
sbit INPUT3 = P1^2;
sbit INPUT4 = P1^3;
sbit ENA = P1^4; //产生PWM波
sbit ENB = P1^5;
uint MA=0,MB=0;
uint SpeedA=20;//50%占空比
uint SpeedB=20;
void delay(uint z) {
uintx,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void main(void)
{
delay(1000) ;
delay(1000) ;
INPUT1=1;
INPUT2=0;
INPUT3=1;
INPUT4=0;
TH0= 0xF4;
TL0= 0x48;
TH1= 0xF4;
TL1= 0x48;
TMOD= 0x11;
TR0= 1;
TR1= 1;
ET0= 1;
ET1= 1;
EA = 1;
while(1){}
}
void time0_int() interrupt 1 using 1
{
TR0=0;
TH0=0xF4;
TL0=0x48;
MA++;
if(MA<SpeedA){
ENA = 1;
}
elseENA = 0;
if(MA== 40){
MA = 0;
}
TR0= 1;
}
void time1_int() interrupt 3 using 1
{
TR1=0;
TH1=0xF4;
TL1=0x48;
MB=MB+ 1;
if(MB< SpeedB){
ENB=1;
}
elseENB = 0;
if(MB== 40){
MB = 0;
}
TR1= 1;
}
(2)
#include <reg52.h>
sbit KEY1 = P3^1;
sbit PWM = P1^5;
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x0.1ms
unsigned char PWM_ON ;//定义高电平时间
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
unsigned char PWM_Num;//定义档位
TMOD |=0x01;//定时器设置 1ms in12M crystal
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定时1mS
IE= 0x82; //打开中断
TR0=1;
CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步
while(1)
{
if(!KEY1)
{
delay(10000);
if(!KEY1)
{
PWM_Num++;
if(PWM_Num==4)PWM_Num=0;
switch(PWM_Num){
case 0:P1=0xFE;PWM_ON=0;break;//高电平时长
case 1:P1=0xFD;PWM_ON=4;break;
case 2:P1=0xFB;PWM_ON=6;break;
case 3:P1=0xF7;PWM_ON=8;break;
default:break;
}
}
}
}
}
/********************************/
/* 定时中断 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定时1mS
if (count==PWM_ON)
{
PWM = 1; //灯灭
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0)//如果左右时间是0 保持原来状态
PWM = 0;//灯亮
}
}
(3)
/***************电子电机驱动模块直流电机控制程序**************************/
#include <reg52.h>
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit EN1=P1^4;
sbit EN2=P1^5;
unsigned int pwm_H;
unsigned int pwm_L;
/***********初始函数函数**********************************/
/*日期:2012年2月2日 */
/*版本号 V1.2*/
/*说明:初始化系统,调用速度设置函数前请先初始化*/
void InitSpeed()
{
TMOD=0X01;
TL0=0;
TH0=0;
TR0=1;
ET0=1;
EA=1;
}
/***********速度设置函数**********************************/
/*日期:2012年2月2日 */
/*版本号 V1.2*/
/*说明:0-1000级速度,值越高速度越快*/
void SetSpeed(unsigned int num)
{
if(num<1000)
{
pwm_L=65535-num;
pwm_H=65536-(1001-num);
}
else return ;
}
/***********速度设置函数**********************************/
/*日期:2012年2月2日 */
/*版本号 V1.2*/
/*说明:左转设置函数*/
void TurnLeft()
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
/***********速度设置函数**********************************/
/*日期:2012年2月2日 */
/*版本号 V1.2*/
/*说明:右转设置函数*/
void TurnRight()
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
/************电机使能*********************************/
/*日期:2012年2月2日 */
/*版本号 V1.2*/
/*说明:右转设置函数*/
void MotorGo()
{
EN1=0;
EN2=0;
}
void main()
{
InitSpeed();
TurnRight();
MotorGo();
SetSpeed(999);
while(1);
}
/*******定时器0中断服务程序*************/
void Timer0() interrupt 1 using 1
{
static char stepFlag;
TR0=0;
if(stepFlag==1)
{
TL0=pwm_H;
TH0=pwm_H>>8;
EN1=0; //电机1不使能
EN2=0; //电机2不使能
stepFlag=0;
}
else
{
TL0=pwm_L;
TH0=pwm_L>>8;
EN1=1; //电机1使能
EN2=1; //电机2使能
stepFlag=1;
}
TR0=1;
}
作者: lxl_51h 时间: 2021-4-11 11:24
用你的程序,电机只有嗡嗡声音,不转动啊
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |