找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2277|回复: 2
收起左侧

pwm 电机调速 l298n

[复制链接]
ID:812531 发表于 2021-2-24 23:47 | 显示全部楼层 |阅读模式
#include <reg52.h>

//IO引脚定义:

sbit IN1=P1^0;               
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
//以上为电机驱动板输入引脚定义,
//IN1和IN2控制左轮电机,输出对应的OU1和OUT2接左轮电机,
//IN3和IN4控制右轮电机,输出对应的OU3和OUT4接右轮电机

sbit L_PWM=P1^4;           //左轮调速,接驱动模块ENA使能端,在这里输入PWM信号
sbit R_PWM=P1^5;           //右轮调速,接驱动模块ENB使能端,在这里输入PWM信号


//宏定义
#define L_go      IN1=0;IN2=1 //左轮前进
#define L_back    IN1=1;IN2=0 //左轮后退   
#define L_stop    IN1=0;IN2=0        //左轮停止,两个输出1也可以
#define R_go            IN3=0;IN4=1 //右轮前进
#define R_back          IN3=1;IN4=0 //右轮后退
#define R_stop          IN3=0;IN4=0 //右轮停止,两个输出1也可以

#define car_go                                L_go;R_go;                //小车前进
#define car_back                        L_back;R_back        //小车后退
#define car_left                        R_go;L_stop                //小车左转弯
#define car_right                        L_go;R_stop                //小车右转弯
#define car_stop                        L_stop;R_stop        //小车停车
#define car_left_360        R_go;L_back                //小车向左360度转,也可以认为是大转弯
#define car_right_360        L_go;R_back                //小车向右360度转,也可以认为是大转弯

//数据定义
unsigned char l_tt=0;        //定时器计数用

unsigned char l_Lpwm=0;        //左轮PWM占空比值,我们设计10个格,0-9,0为停止,9为全速
unsigned char l_Rpwm=0;        //右轮PWM占空比值,我们设计10个格,0-9,0为停止,9为全速


//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1   using 2
{
        TH0=0XFC;          //定时1毫秒,10格调速,为100HZ频率,此频率下效果比较好,过大有噪声,过小振动大
        TL0=0X17;
        l_tt++;
        if(l_tt>9)l_tt=0;        //比较用,10格调速
       
        if(l_tt<=l_Lpwm){//左调速,占空比数值越大,输出高电平时间越宽,电机转速越高,我们设计10个格,0-9,0为停止,9为全速
                 L_PWM=1;
        }
        else{
                L_PWM=0;
        }
        if(l_tt<=l_Rpwm){//右调速,同上
                R_PWM=1;
        }
        else{
                R_PWM=0;
        }
}       

//延时
void Delay(unsigned int t)
{
        unsigned int c;
        while(t--){
                c=10000;
                while(c--);
        }
}
//入口函数
void main(void)
{
        unsigned char i;
        EA=1;                                                //首先开启总中断
        TMOD|=0X11;                        //定时器方式1,16位计数器,用来计数时间
        TH0= 0XFC;                  //1ms定时
        TL0= 0X14;
        TR0= 1;
        ET0= 1;
       
        while(1){
                l_Lpwm=0;
                car_go;                        //前进
                for(i=0;i<10;i++){//慢慢提速
                        l_Lpwm++;       
                        l_Rpwm++;
                        Delay(2);
                }               
                Delay(5);                                        //保持速度前进一会
                for(i=0;i<10;i++){//慢慢降速
                        l_Lpwm--;       
                        l_Rpwm--;
                        Delay(2);
                }               
                Delay(10);
               
                car_back;                //后退,以下原理同上
                for(i=0;i<10;i++){
                        l_Lpwm++;       
                        l_Rpwm++;
                        Delay(2);
                }               
                Delay(5);
                for(i=0;i<10;i++){
                        l_Lpwm--;       
                        l_Rpwm--;
                        Delay(2);
                }               
                Delay(10);
        }
}

回复

使用道具 举报

ID:899274 发表于 2021-5-16 14:48 | 显示全部楼层
谢谢提供程序 正好在找这方面的
回复

使用道具 举报

ID:904958 发表于 2021-5-17 05:12 | 显示全部楼层
原理图能分享吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表