标题:
在写一个控制电机L298的正反转及调速问题,但是调速实现不了,请大佬能不能帮我看....
[打印本页]
作者:
匿名信封研
时间:
2019-1-20 15:06
标题:
在写一个控制电机L298的正反转及调速问题,但是调速实现不了,请大佬能不能帮我看....
在写一个控制电机L298的正反转及调速问题,但是调速实现不了,请大佬能不能帮我看下这个程序呢,可能是和我不会用调速有关,这个电机能实现正反转,但是不能去调速,请问能不能帮我一下呢
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P1^0;
sbit IN2=P1^4;
sbit PWMA=P1^2;
sbit STBY=P1^3;
sbit FM=P2^3;
sbit key=P3^2; //按键串口
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=125;y>0;y--);
}
void Int0Init()
{
//设置INT0
IT0=1;//跳变沿出发方式(下降沿)
EX0=1;//打开INT0的中断允许。
EA=1;//打开总中断
}
void main()
{
// P1=0X00; //程序初始化
// P1=0XFF; //P1口置1
Int0Init();
PWMA=1;
STBY=1;
IN1=1;
IN2=0; //初始化电机正转
while(1)
{
//delay(500);
// keyscan();
//Timer0Init();
}
}
void Int0() interrupt 0 //外部中断0的中断函数
{
IN1=0;
IN2=1;
delay(2000); //延时消抖
IN1=0;
IN2=0;
}
作者:
HC6800-ES-V2.0
时间:
2019-1-21 08:35
其实论坛中有很多这样的程序,一看你的程序,行数就不够嘛——根本没有调速的内容。
在智能小车板块中去找。
/**********************亚博智能小车黑线循迹例程************************
* 学习建议:进行智能小车程序学习前,可先看51单片机开发板配套28课视频教程
******************************************************************/
//按下K4按键,1秒左右启电小车
//按下复位健可以停止小车
//注意程序只做参考之用,要达到最理想的寻迹效果,还需要同学们细心调试。
#include <reg52.h> //包含52系统头文件
#include "bst_car.h" //包含bst_car.h智能小车头文件
unsigned char pwm_val_left =0;//变量定义
unsigned char pwm_val_right =0;
unsigned char push_val_left =5;// 左电机占空比N/20 //速度调节变量 0-20。。。0最小,20最大
unsigned char push_val_right=5;// 右电机占空比N/20
// 大家可以根据循迹效果修改以上两个数值
bit Right_PWM_ON=1; //右电机PWM开关
bit Left_PWM_ON =1; //左电机PWM开关
//延时函数
void delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=112;j>0;j--);
}
//前进
void run(void)
{
push_val_left=6; //速度调节变量 0-20。。。0最小,20最大
push_val_right=6;
Left_moto_go ; //左电机往前走
Right_moto_go ; //右电机往前走
}
//左转
void leftrun(void)
{
push_val_left=5;
push_val_right=5;
Right_moto_go ; //右电机往前走
Left_moto_Stop ; //左电机停止
}
//右转
void rightrun(void)
{
push_val_left=5;
push_val_right=5;
Left_moto_go ; //左电机往前走
Right_moto_Stop ; //右电机往前走
}
//停止
void stop(void)
{
Left_moto_Stop ;
Right_moto_Stop ;
}
/************************************************************************/
// PWM调制电机转速
// 左电机调速
/*调节push_val_left的值改变电机转速,占空比*/
void pwm_out_left_moto(void)
{
if(Left_PWM_ON)
{
if(pwm_val_left<=push_val_left)
{
EN1=1;
}
else
{
EN1=0;
}
if(pwm_val_left>=20)
pwm_val_left=0;
}
else
{
EN1=0; //若未开启PWM则EN1=0 左电机 停止
}
}
/******************************************************************/
/* 右电机调速 */
void pwm_out_right_moto(void)
{
if(Right_PWM_ON)
{
if(pwm_val_right<=push_val_right) //20ms内电平信号 111 111 0000 0000 0000 00
{
EN2=1; //占空比6:20
}
else
{
EN2=0;
}
if(pwm_val_right>=20)
pwm_val_right=0;
}
else
{
EN2=0; //若未开启PWM则EN2=0 右电机 停止
}
}
//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1 using 2
{
TH0=0XFC; //1Ms定时
TL0=0X66;
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
void keyscan(void) //按键扫描函数
{
A: if(K4==0) //判断是否有按下信号
{
delay(10); //延时10ms
if(K4==0) //再次判断是否按下
{
FM=0; //蜂鸣器响
while(K4==0); //判断是否松开按键
FM=1; //蜂鸣器停止
}
else
{
goto A; //跳转到A重新检测
}
}
else
{
goto A; //跳转到A重新检测
}
}
//主函数
void main(void)
{
P1=0X00; //关电机
keyscan(); //按键启动检测
delay(1000);//1s后启动
TMOD=0X01;
TH0= 0XFC; //1ms定时
TL0= 0X66;
TR0= 1;
ET0= 1;
EA = 1; //开总中断
while(1) //无限循环
{
//有信号为0 没有信号为1
if(Left_1_led==0&&Right_1_led==0)
run(); //调用前进函数
else if(Left_1_led==1&&Right_1_led==0) //左边检测到黑线
{
leftrun(); //调用小车左转函数
}
else if(Right_1_led==1&&Left_1_led==0) //右边检测到黑线
{
rightrun(); //调用小车右转函数
}
else
stop();
}
}
这个程序是由程序固定调速的,你可以看懂后,通过按键等改变相关的值,达到电机动态调速。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1