智能车制作

标题: 如何使用两个 IO+两路 PWM 来控制两个轮子的正反向 [打印本页]

作者: qyy1234567    时间: 2018-11-30 22:46
标题: 如何使用两个 IO+两路 PWM 来控制两个轮子的正反向
如何使用两个 IO+两路 PWM 来控制两个轮子的正反向
作者: qyy1234567    时间: 2018-11-30 22:50
最好有代码让我看看  第一次做智能车  啥都不太会

补充内容 (2018-12-1 01:12):
AT89C51的板子
作者: The-answer    时间: 2018-12-6 15:57
一把都是四路PWM才可以控制正反转,;两路只能控制往一个方向转,但是和你的驱动有关系,比如某些负电压驱动的,输入负的PWM就可以反转,又比如L298N这种有使能端的,可以用一路PWM加两个IO控制正反转。我感觉是这样,我是新手,如有说错请见谅
作者: 小白411    时间: 2018-12-17 19:38
我来说说我的解决方案 ,
首先我用的是德科技术大功率驱动板,驱动板的使用说明为:
“IN1和IN2控制左边的驱动,IN3和IN4控制右边的驱动。当IN1给PWM,IN2给0,即正转,当IN1给0,IN2给PWM,即反转。二边都给0,或者给反方向速度就刹车。”
淘宝详细网址为“https://item.taobao.com/item.htm ... amp;id=551846152310
在该界面有详细的硬件说明。
希望能有所帮助。
新手答题,如有谬误,勿怪。
作者: 小白411    时间: 2018-12-17 21:02
本帖最后由 小白411 于 2018-12-17 21:10 编辑

我曾用过两块STC12C5A60S2作主控,该芯片有2路PCA模块可以输出PWM信号,配合德科技术电机驱动板,就可以做到控制小车前进后退。程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. #define FOSC    11059200L

  4. typedef unsigned char BYTE;
  5. typedef unsigned int WORD;

  6. /*Declare SFR associated with the PCA */
  7. sfr CCON        =   0xD8;           //PCA control register
  8. sbit CCF0       =   CCON^0;         //PCA module-0 interrupt flag
  9. sbit CCF1       =   CCON^1;         //PCA module-1 interrupt flag
  10. sbit CR         =   CCON^6;         //PCA timer run control bit
  11. sbit CF         =   CCON^7;         //PCA timer overflow flag
  12. sfr CMOD        =   0xD9;           //PCA mode register
  13. sfr CL          =   0xE9;           //PCA base timer LOW
  14. sfr CH          =   0xF9;           //PCA base timer HIGH
  15. sfr CCAPM0      =   0xDA;           //PCA module-0 mode register
  16. sfr CCAP0L      =   0xEA;           //PCA module-0 capture register LOW
  17. sfr CCAP0H      =   0xFA;           //PCA module-0 capture register HIGH
  18. sfr CCAPM1      =   0xDB;           //PCA module-1 mode register
  19. sfr CCAP1L      =   0xEB;           //PCA module-1 capture register LOW
  20. sfr CCAP1H      =   0xFB;           //PCA module-1 capture register HIGH
  21. sfr PCAPWM0     =   0xf2;
  22. sfr PCAPWM1     =   0xf3;
  23. void Delay100ms()                //@11.0592MHz
  24. {
  25.         unsigned char i, j, k;

  26.         _nop_();
  27.         _nop_();
  28.         i = 5;
  29.         j = 52;
  30.         k = 195;
  31.         do
  32.         {
  33.                 do
  34.                 {
  35.                         while (--k);
  36.                 } while (--j);
  37.         } while (--i);
  38. }
  39. void main()
  40. {
  41.         EA=1;                                                        //使能总中断                                                                                
  42.         TMOD=0x01;                                                //设置T0为模式1
  43.         TH0=(65536-1000)/256;                        //为T0赋值,定时1ms
  44.         TL0=(65536-1000)%256;
  45.         TR0=1;                                                        //启动T0
  46.         ET0=1;                                                        //使能T0中断
  47.         CCON=0;                                                        //初始PCA
  48.         CL=0;                                                        //重置PCA
  49.         CH=0;
  50.         CMOD=0x0a;                                                //将PCA定时器时钟源设置为Fosc/4
  51.         CCAP0H=CCAP0L=0x80;                                //PCA0占空比为50%
  52.         CCAP1H=CCAP1L=0xff;                                //PCA1占空比为0%
  53.         CCAPM0=0x42;                                          //PCA模块0工作在8位PWM模式,没有PCA中断
  54.         CCAPM1=0x42;                                          //PCA模块1工作在8位PWM模式,没有PCA中断
  55.         CR=1;                                                        //PCA定时器开始运行
  56.         while(1);
  57. }
  58. void Timer0()interrupt 1
  59. {
  60.         unsigned long cnt;                                //计数变量cnt
  61.         bit dir;                                                //方向变量dir
  62.         TH0=(65536-1000)/256;                        //定时器重新赋值
  63.         TL0=(65536-1000)%256;
  64.         cnt++;
  65.         if(cnt>=10000)                                        //10s计时
  66.         {
  67.                 cnt=0;                                                //cnt归零
  68.                 if(dir==0)                                        //dir=0时
  69.                 {
  70.                         CCAP0H=CCAP0L=0xff;                //PCA0占空比为0%
  71.                         Delay100ms();
  72.                         CCAP1H=CCAP1L=0x80;                //PCA1占空比为50%
  73.                 }
  74.                 else                                                //dir=1时
  75.                 {
  76.                         CCAP1H=CCAP1L=0xff;                //PCA1占空比为0%
  77.                         Delay100ms();
  78.                         CCAP0H=CCAP0L=0x80;                //PCA0占空比为50%
  79.                 }
  80.                 dir=~dir;                                        //改变方向
  81.         }        
  82. }
复制代码

该程序可以做到轮子正反转,PWM输出,以10s为间隔改变运动方向。
此方案的缺点为:需要两个芯片才可以控制一辆车,改进方案为使用有4路PCA的单片机,如STC8A8K16S4A12。使用一个单片机就可以控制一辆车。
作者: 小白411    时间: 2018-12-17 21:03
本帖最后由 小白411 于 2018-12-17 21:09 编辑

附德科技术的电机驱动板的链接:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-15159252443.12.3e096513bAL0Lj&id=545832795401





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2