• 智能小车—PWM方式实现小车调速和转向


    目录

    1. 让小车动起来

    2. 串口控制小车方向

    3. 如何进行小车PWM调速

    4. PWM方式实现小车转向


    1. 让小车动起来

    电机模块开发

    L9110s概述

    接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,具体根据实际调试

    IA1输入高电平,IA1输入低电平,【OA1 OB1】电机正转;

    IA1输入低电平,IA1输入高电平,【OA1 OB1】电机反转;

    IA2输入高电平,IA2输入低电平,【OA2 OB2】电机正转;

    IA2输入低电平,IA2输入高电平,【OA2 OB2】电机反转;

    核心代码:

    1. #include "reg52.h"
    2. #include "intrins.h"
    3. sbit RightCon1A = P3^2;
    4. sbit RightCon1B = P3^3;
    5. sbit LeftCon1A = P3^4;
    6. sbit LeftCon1B = P3^5;
    7. void Delay1000ms() //@11.0592MHz
    8. {
    9. unsigned char i, j, k;
    10. _nop_();
    11. i = 8;
    12. j = 1;
    13. k = 243;
    14. do
    15. {
    16. do
    17. {
    18. while (--k);
    19. } while (--j);
    20. } while (--i);
    21. }
    22. void goForward()
    23. {
    24. LeftCon1A = 0;
    25. LeftCon1B = 1;
    26. RightCon1A = 0;
    27. RightCon1B = 1;
    28. }
    29. void goLeft()
    30. {
    31. LeftCon1A = 0;
    32. LeftCon1B = 0;
    33. RightCon1A = 0;
    34. RightCon1B = 1;
    35. }
    36. void goRight()
    37. {
    38. LeftCon1A = 0;
    39. LeftCon1B = 1;
    40. RightCon1A = 0;
    41. RightCon1B = 0;
    42. }
    43. void goBack()
    44. {
    45. LeftCon1A = 1;
    46. LeftCon1B = 0;
    47. RightCon1A = 1;
    48. RightCon1B = 0;
    49. }
    50. void main()
    51. {
    52. while(1){
    53. goForward();
    54. Delay1000ms();
    55. Delay1000ms();
    56. goBack();
    57. Delay1000ms();
    58. Delay1000ms();
    59. goLeft();
    60. Delay1000ms();
    61. Delay1000ms();
    62. goRight();
    63. Delay1000ms();
    64. Delay1000ms();
    65. }
    66. }

    2. 串口控制小车方向

    串口介绍:

    串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方 式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简 单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成 本,特别适用于远距离通信,但传送速度较慢

    • 串口分文件编程进行代码整合——通过现象来改代码
    • 接入蓝牙模块,通过蓝牙控制小车
    • 添加点动控制,如果APP支持按下一直发数据,松开就停止发数据(蓝牙调试助手的自定义按键不 能实现),就能实现前进按键按下后小车一直往前走的功能

    3. 如何进行小车PWM调速

    原理: 全速前进是LeftCon1A = 0; LeftCon1B = 1;完全停止是LeftCon1A = 0;LeftCon1B = 0;那么单位时 间内,比如20ms, 有15ms是全速前进,5ms是完全停止, 速度就会比5ms全速前进,15ms完全停止获得的功率多,相应的速度更快!

    开发:借用PWM的舵机控制代码

    核心代码:

    1. #include "motor.h"
    2. #include "delay.h"
    3. #include "uart.h"
    4. #include "time.h"
    5. extern char speed;
    6. void main()
    7. {
    8. Time0Init();
    9. //UartInit();
    10. while(1){
    11. speed = 10;//10份单位时间全速运行,30份停止,所以慢,20ms是40份的500us
    12. Delay1000ms();
    13. Delay1000ms();
    14. speed = 20;
    15. Delay1000ms();
    16. Delay1000ms();
    17. speed = 40;
    18. Delay1000ms();
    19. Delay1000ms();
    20. }
    21. }
    22. //time.c
    23. #include "motor.h"
    24. #include "reg52.h"
    25. char speed;
    26. char cnt = 0;
    27. void Time0Init()
    28. {
    29. //1. 配置定时器0工作模式位16位计时
    30. TMOD = 0x01;
    31. //2. 给初值,定一个0.5出来
    32. TL0=0x33;
    33. TH0=0xFE;
    34. //3. 开始计时
    35. TR0 = 1;
    36. TF0 = 0;
    37. //4. 打开定时器0中断
    38. ET0 = 1;
    39. //5. 打开总中断EA
    40. EA = 1;
    41. }
    42. void Time0Handler() interrupt 1
    43. {
    44. cnt++; //统计爆表的次数. cnt=1的时候,报表了1
    45. //重新给初值
    46. TL0=0x33;
    47. TH0=0xFE;
    48. //控制PWM波
    49. if(cnt < speed){
    50. //前进
    51. goForward();
    52. }else{
    53. //停止
    54. stop();
    55. }
    56. if(cnt == 40){//爆表40次,经过了20ms
    57. cnt = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
    58. }
    59. }

    4. PWM方式实现小车转向

    原理: 左轮定时器0调速,右轮定时器1调速,那么左转就是右轮速度大于左轮!

    核心代码:

    1. #include "motor.h"
    2. #include "reg52.h"
    3. char speedLeft;
    4. char cntLeft = 0;
    5. char speedRight;
    6. char cntRight = 0;
    7. void Time1Init()
    8. {
    9. //1. 配置定时器1工作模式位16位计时
    10. TMOD &= 0x0F;
    11. TMOD |= 0x1 << 4;
    12. //2. 给初值,定一个0.5出来
    13. TL1=0x33;
    14. TH1=0xFE;
    15. //3. 开始计时
    16. TR1 = 1;
    17. TF1 = 0;
    18. //4. 打开定时器1中断
    19. ET1 = 1;
    20. //5. 打开总中断EA
    21. EA = 1;
    22. }
    23. void Time0Init()
    24. {
    25. //1. 配置定时器0工作模式位16位计时
    26. TMOD = 0x01;
    27. //2. 给初值,定一个0.5出来
    28. TL0=0x33;
    29. TH0=0xFE;
    30. //3. 开始计时
    31. TR0 = 1;
    32. TF0 = 0;
    33. //4. 打开定时器0中断
    34. ET0 = 1;
    35. //5. 打开总中断EA
    36. EA = 1;
    37. }
    38. void Time1Handler() interrupt 3
    39. {
    40. cntRight++; //统计爆表的次数. cnt=1的时候,报表了1
    41. //重新给初值
    42. TL1=0x33;
    43. TH1=0xFE;
    44. //控制PWM波
    45. if(cntRight < speedRight){
    46. //右前进
    47. goForwardRight();
    48. }else{
    49. //停止
    50. stopRight();
    51. }
    52. if(cntRight == 40){//爆表40次,经过了20ms
    53. cntRight = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
    54. }
    55. }
    56. void Time0Handler() interrupt 1
    57. {
    58. cntLeft++; //统计爆表的次数. cnt=1的时候,报表了1
    59. //重新给初值
    60. TL0=0x33;
    61. TH0=0xFE;
    62. //控制PWM波
    63. if(cntLeft < speedLeft){
    64. //左前进
    65. goForwardLeft();
    66. }else{
    67. //停止
    68. stopLeft();
    69. }
    70. if(cntLeft == 40){//爆表40次,经过了20ms
    71. cntLeft = 0; //当100次表示1s,重新让cnt从0开始,计算下一次的1s
    72. }
    73. }

  • 相关阅读:
    JavaScript设计模式中的装饰者模式
    19-Mitt
    第一章:最新版零基础学习 PYTHON 教程(第十三节 - Python 语句中的 –Python While 循环)
    Git使用教程
    LeetCode-268(Python)—— 丢失的数字
    HTML小游戏10 —— 休闲类游戏《解救海盗船长》(附完整源码)
    割草机器人芯片选型及各厂家产品对比
    Vue记录(上篇)
    广告内容定向分级,保护未成年人身心健康
    【Linux】关于磁盘操作命令
  • 原文地址:https://blog.csdn.net/m0_74712453/article/details/132716155