找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13146|回复: 11
打印 上一主题 下一主题
收起左侧

浅谈单片机PWM控制直流电机+编程(L298N)

  [复制链接]
跳转到指定楼层
楼主
ID:194729 发表于 2019-4-20 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此篇文章免费分享给大家,这篇文章结合笔者所学以及在往上参考大神的讲解,通过自己的理解整理成文档,在此免费分享给大家,由于笔者是一名在读学生,文中难免有不当之处,如有错误,望大家指正!!
实现的主要功能:

1.控制正反转
2.加减速
3.停止
视频链接:后续再补吧,还要审核好麻烦的

PWM控制直流电机额,,,,由于笔者是一名学生(主要还是经验不丰富),所以,当然,此次,又掉进坑里了。

此次所用的芯片,主要是L298N、直流电机、51单片机;程序非常简单,在此,我也会贴出来的,工程文件放在附件中,需要的直接下载!


话不多说,看图讲坑:

第一个坑:首先,讲一下L298N使能端,L298N的使能端买回来的时候是被一个跳线帽给连接着的呢,那么此时,该如何连接呢?
对于连接有俩种情况:1.如果你只需要控制正反转,对速度没有要求的话,跳线帽需要插上去。只需要控制控制端就可以控制正反转了。2.如果你需要PWM调速,那么此时就要格外小心了,因为笔者就是跳进这个坑了。看图~~,使能端拔掉跳线帽有个插头,红色箭头的是1,绿色箭头的是2,特别注意,如果调速的话,一定要使输出PWM波的那段连接在1处,如果连接在2处,则会毫无作用。切记,切记,切记

第二个坑:我是通过外接电源盒来给直流电机供电的,这个时候,记得外接电源盒的地端一定要和单片机地端共地、共地、共地。否则。不转······

图2.电池盒和单片机共地

之前写过一篇详细介绍L298N的用法的文章,如果有需要的可以直接去下载,
此次主要讲这俩个容易忽略的坑,链接:http://www.51hei.com/bbs/dpj-83045-1.html

程序代码如下:
1.按键程序
#ifndef key_h
#define key_h
sbit key_1=P1^0;      //顺时针转动
sbit key_2=P1^1;      //逆时针转动
sbit key_3=P1^2;      // 加速转动
sbit key_4=P1^3;      //减速转动
sbit key_5=P1^4;      //停止转动
unsigned char PWM_Count=20;   //占空比控制字
unsigned char n=5;   //速度增减量5
sbit in1=P3^0;
sbit in2=P3^1;
sbit ena=P3^2;
void delays()
{
  unsigned char i;
  for(i=80;i>0;i--);
}
void key()
{
  P1=0XFF;
  if(key_1==0)
  {
    delays();
    if(key_1==0)
    {
      in1=0;
      in2=1;
    }               //顺时针转动
    while(!key_1);
  }

    if(key_2==0)
  {
    delays();
    if(key_2==0)
    {
      in1=1;
      in2=0;
    }
    while(!key_2);
  }                //逆时针转动

    if(key_3==0)
  {
    delays();
    if(key_3==0)
    {
      PWM_Count=PWM_Count+n;
      if(PWM_Count>=100)
        PWM_Count=100;
    }
    while(!key_3);
  }               //加速转动 ,如果大于等于100就全速转动

    if(key_4==0)
  {
    delays();
    if(key_4==0)
    {
     if(PWM_Count>10)
     {
       PWM_Count=PWM_Count-n;
     }
      else
      PWM_Count=5;       //减速转动,最低转速为5
    }
    while(!key_4);
  }

    if(key_5==0)
  {
    delays();
    if(key_5==0)
    {
      in1=0;
      in2=0;
    }
    while(!key_5);
  }                  //电机停止转动
}
#endif

2.主程序
#include<reg51.h>
#include "key.h"
unsigned char count=0;           
void Timer_Init()
{
  TMOD=0X01;      //T0定时方式1
  TH0=0Xfc;
  TL0=0X66;       //计数初值设置为1ms
  ET0=1;          //打开定时器0的中断
  TR0=1;          //打开定时器0
  EA=1;           //开总中断
}
void main()
{
  in1=0;
  in2=1;
  ena=1;
  Timer_Init();
  while(1)
  {
    key();
  }
}
void Timer() interrupt 1      //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1
{
  TR0=0;
  TH0=0Xfc;
  TL0=0X66;       //重新赋计数初值为1ms
  if(count<=PWM_Count)
  {
    ena=1;
  }
  else
  {
    ena=0;
  }
  count++;
  if(count>=100)
  {
    count=0;
  }
  TR0=1;
}

全部资料51hei下载地址:
浅谈PWM控制直流电机.docx (407.24 KB, 下载次数: 75)
PWM直流电机调速程序.zip (19.22 KB, 下载次数: 142)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:194729 发表于 2019-4-20 15:04 | 只看该作者
本人开通了公 号(忙过这段日子,就开始更新文章),致力于初学者的单片机学习-----浅谈小白
如果大家有什么问题可以加这个公 号,共同学习
大神也可以进来指导指导
回复

使用道具 举报

板凳
ID:194729 发表于 2019-4-20 21:29 | 只看该作者
回复

使用道具 举报

地板
ID:511189 发表于 2019-4-21 10:11 | 只看该作者
利用L298N控制一个电机转动?
回复

使用道具 举报

5#
ID:89286 发表于 2019-4-21 13:16 | 只看该作者
thanks for sharing
回复

使用道具 举报

6#
ID:194729 发表于 2019-4-21 13:43 | 只看该作者
liu0213 发表于 2019-4-21 10:11
利用L298N控制一个电机转动?

视频中是控制一个电机的正反转、加减速,如果需要可以自己修改一下,原理就是那么个原理
回复

使用道具 举报

7#
ID:194729 发表于 2019-4-22 09:46 | 只看该作者

也算是简单记录一下学习的日常吧,以后还望大佬多多指点
回复

使用道具 举报

8#
ID:144816 发表于 2019-4-22 14:20 | 只看该作者
请问下有原理图或者仿真吗
回复

使用道具 举报

9#
ID:194729 发表于 2019-4-22 15:38 | 只看该作者
信陵君 发表于 2019-4-22 14:20
请问下有原理图或者仿真吗

这个东西接线很简单的,有需要可以帮忙画
回复

使用道具 举报

10#
ID:795526 发表于 2020-7-2 11:33 | 只看该作者
不用在中断函数里再关开定时器0了吧,就是void Timer() interrupt 1 里面的TR0=0和TR0=1,因为你在中断里也赋初值了,他就会每隔1ms执行一次了吧
回复

使用道具 举报

11#
ID:795526 发表于 2020-7-2 11:51 | 只看该作者
你这个设置的就是100ms为一个PWM周期吗
回复

使用道具 举报

12#
ID:692524 发表于 2020-7-2 12:22 | 只看该作者
谢谢楼主,帮忙解决了一个大问题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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