• 串口控制小车和小车PWM调速


    1.串口控制小车

            1. 串口分文件编程进行代码整合,通过现象来改代码

            2.接入蓝牙模块,通过蓝牙控制小车

            3.添加点动控制,如果APP支持按下一直发数据,松开就停止发数据(蓝牙调试助手的自定义按键不能实现),就能实现前进按键按下后小车一直往前走的功能

    2.如何进行小车PWM调速

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

    总结:前进时间占比少就慢,前进时间占比多就快
     

    核心代码:

            

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

    3.通过PWM控制小车转向

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

            在main函数中,同时给左右轮速度,一快一慢,从而实现左前右前进
            

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

  • 相关阅读:
    001 rabbitmq减库存demo direct
    禅道16.5升级17.3
    【Python 千题 —— 基础篇】浮点数转换为整数
    私域流量时代来临,电商企业如何布局?
    [附源码]计算机毕业设计springboot小型银行管理系统
    RK3568平台开发系列讲解(音视频篇)H264 的编码结构
    技术管理进阶——一线Leader与大Leader的差异是什么?
    看 AI 如何抢救破烂文档
    关于python类中的魔法方法
    【C】指针进阶(下)
  • 原文地址:https://blog.csdn.net/m0_74156325/article/details/139413338