模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762

        44---有刷直流马达速度位置控制实验:

                硬件需求:PC机,PCM模块一个,microUSB线,L298N_电机驱动模块,12V/1A直流

                 电源,有刷直流电机1个,导线若干;

                软件需求:PCM编译软件,app软件NeTorch TCP & UDP;

                供电方式:12V电源供电给电机驱动模块,电机驱动模块输出的5V给PCM模块供 电;

                连接电路:如图67

图67         有刷直流马达速度位置控制实验电路

图68         正交旋转编码器波形图

PCM模块有4个有刷直流马达控制通道,分别为马达1(A0,B0),马达2(A1,

B1),马达3(A2,B2),马达4(A3,B3). L298N_电机驱动模块可以同时驱动2个

马达。本实验使用A0,B0控制1个马达。

本实验使用的是一个小型直流减速马达,减速比为1:20.41。马达接了一个正交旋转

编码器,11线,即旋转一圈有11个脉冲输出,所以马达输出轴转一周就是

11*20.41=224.51个脉冲。

编码器有AB相输出,输出波形如图68所示。AB波形都是50%占空比的脉冲波形,2

个波形相位相差90度。利用这个特性,我们这样来判断正反向:当A相波形在上升沿

时,判断B相波形电平,如果为低电平,表示正转;如果为高电平,表示反转。

根据正交旋转编码器的这个特性,电路上,我们把A相接模块SIG0引脚,B相接模

块CTR0引脚。使用脉冲计数指令的运行模式4,如下表2:当SIG0出现上升沿,且CTR0

为低电平时,脉冲计数加1;当SIG0出现上升沿,且CTR0为高电平时,脉冲计数减1;

所以计数值就代表了马达当前的位置。

运行模式

ctr=0

ctr=1

上升沿

下降沿

上升沿

下降沿

4

+

N

-

N

表2         脉冲计数运行模式4

编程思路:

设置脉冲计数的最大值中断,值为30000个脉冲,即脉冲正方向计数达到30000个

脉冲时会执行中断程序;设置脉冲计数的最小值中断,值为-30000个脉冲,即脉冲反方

向计数达到30000个脉冲时会执行中断程序;在中断程序中判断是最大值中断还是最小

值中断,并使用一个寄存器作为累加计数。

设置马达的PWM频率为10Khz.设置好PID的Kp,Ki,Kd值,此值要根据实际情况调

试。

使用一个定时器,设置为周期性定时,定时周期为0.001秒。在定时中断程序中读

取脉冲计数值,用此值减去上一个周期读取的脉冲值,差值就是一个周期马达移动的位

置,然后再除以周期值0.001秒,就是马达运行的速度。马达的运行位置及速度都有了,

使用2个pid指令,分别控制位置及速度就可以实现马达的位置及速度的闭环控制。

图69为手机端APP网络调试助手截图,采用HEX模式发送数据,数据的发送方式

是:速度,位置,速度,位置。。。;图示发送的是01 14 02 00 03 28 04 00共8个字

节,第一个字节01表示速度是1圈每秒,第二个字节14表示马达要转到第20圈,第3个字

节02表示速度是2圈每秒,第4个字节00表示马达要转到原点位置,第5个字节03表示速

度是3圈每秒,第6个字节28表示马达要转到第40圈位置,第7个字节04表示速度是4圈每

秒,第8个字节00表示马达又转回到原点位置,

实验程序如下:

1 intpro int1 //定时器中断程序,定时周期0.001秒

2         pcntread 0 D3 //读通道0的计数值到D3寄存器

3         mul d4 d8 d5 //d5=d4*d8=d4*30000,脉冲计数最大值是d8=30000,d4是记录了几

//个最大值

4         add d5 d3 d5 //d5=d5+d3,加上当前脉冲计数值

5         mov d5 f0 //计数脉冲转换成浮点数

6         div f0 f101 f2 //计算马达当前位置f2=f0/f101,脉冲数/224.51=圈数,

7         pidrun 0 f2 f81 f85 //pid0运算,f2实际位置,f81设定位置,f85为pid输出

8         if f85 > f86 // 限幅,f86为正转最大位置

9                 mov f86 f85 //大于正转最大位置,就使用最大位置

10         elif f85 < f87 // 限幅,f87为反转最大位置

11                 mov f87 f85 //小于反转最大位置,就使用最大位置

12         endif

13         sub f2 f3 f4 //计算一个周期的差值,f3为上周期的位置

14         div f4 f82 f5 //计算速度。f5=f4/f82,圈数/更新周期(0.001秒)=圈数/秒,

15         mov f2 f3 //保存当前位置到F3

16         pidrun 1 f5 f85 f84 //pid1运算,f5实际速度,f85设定速度,f84为pid输出

17         if f84 > 100 //限制占空比最大为100%,正转

18                 mov 100 f84 //超过100,存入100

19         elif f84 < -100 //限制占空比最大为-100%,反转

20         ​​​​​​​        mov -100 f84 //小于-100,存入-100

21         endif

22         brushmotomove 0 f84 //马达启动0,占空比为F84,改变占空比就可以改变马达速

//度

23         if d64 > 0 //D64大于0,表示正转

24         ​​​​​​​        if f2 >= f81 //如果当前位置大于等于设定位置,准备调用下一组设定值

25         ​​​​​​​        ​​​​​​​        if d63 < d60 //计数小于设定组数

26         ​​​​​​​        ​​​​​​​        ​​​​​​​        call sdsub //调用速度位置提取子程序

27         ​​​​​​​        ​​​​​​​        ​​​​​​​        call pidsub //调用pid重新初始化子程序

28         ​​​​​​​        ​​​​​​​        endif

29         ​​​​​​​        endif

30         else //D64=0,表示反转

31         ​​​​​​​        if f2 <= f81 //反转,如果当前位置小于等于设定位置,准备调用下一组设定

//值

32         ​​​​​​​        ​​​​​​​        if d63 < d60 //计数小于设定组数

33         ​​​​​​​        ​​​​​​​        ​​​​​​​        call sdsub //调用速度位置提取子程序

34         ​​​​​​​        ​​​​​​​        ​​​​​​​        call pidsub //调用pid重新初始化子程序

35         ​​​​​​​        ​​​​​​​        endif

36         ​​​​​​​        endif

37         endif

38 endint

39 intpro int0 //脉冲计数中断程序,30000个脉冲周期

40         if d2 = 8 //最大值中断

41        ​​​​​​​         inc d4 //脉冲计数达到最大值30000个脉冲,把d4加1

42         elif d2 = 4 //最小值中断

43         ​​​​​​​        dec d4 //脉冲计数达到最小值-30000个脉冲,把d4减1

44         endif

45 endint

46 intpro wifi //WIFI站点连接中断程序

47         prints "wifi station connect\r\n" //串口输出有站点连接的信息

48 endint

49 intpro tcpserverint //有TCP客户端连接中断

//初始化TCP服务器接收数据指令,D10为客户端连接序列号,接收的数据起始寄存

//器地址为D11; 接收的字节数存入D60;接收数据后S4置位,会执行tcpserverrecv中

//断程序

50         tcpserverrecv d10 d11 d60 s4

51 endint

52 subpro sdsub //速度位置提取子程序

//读取字节,把D11开始的D63位置的字节保存到D61寄存器,D63为偶数,读取的

//是速度值

53         rbyte d11 d61 d63

54         mov d61 f86 //把设定的速度转换成浮点数。单位:圈/秒,

55         sub 0 f86 f87 //保存反转最大速度为负数

56         inc d63 //计数加1

//读取字节,把D11开始的D63位置的字节保存到D61寄存器,D63为奇数,读取的

//是位置值

57         rbyte d11 d61 d63

58         mov d61 f81 //马达位置转换成浮点数。单位:圈

59         if f81 >= f2 //f2为当前马达位置,f81为设定马达位置,如果设定位置大于当前位

//置,马达正转

60         ​​​​​​​        mov 1 d64 //D64置1,表示正转

61         else

62         ​​​​​​​        mov 0 d64 //否则D64清零,表示反转

63         endif

64         inc d63 //计数加1

65 endsub

66 subpro pidsub //pid重新初始化子程序

//以下3个公式主要是计算pid0和1的kp值,原则就是设定速度越大,kp越小。

67         div 50 f86 f10 //f10=50/f86,f86是设定马达速度,设定速度越大f10越小

68         add 20 f10 f90 //f90=20+f10,kp给一个最小值加上f10值

69         mov f90 f93 // f93是pid1的kp,使2个pid的kp值相同

//以下2个公式主要是计算pid1的ki值,原则就是设定速度越大,ki越小。

70         div 1 f86 f10 //f10=1/f86,f86是设定马达速度,设定速度越大f10越小

71         add 0.1 f10 f94 //f94=0.1+f10,ki给一个最小值加上f10值

72         pidinit 0 f90 f91 f92 f82 //pid0初始化,f90为kp根据速度计算;f91为ki=0;

//f92为kd=0;f82为更新 周期

73        ​​​​​​​pidinit 1 f93 f94 f95 f82 //pid1初始化,f93为kp根据速度计算;f94为ki根据速度计

//算;f95为kd=0;f82为更新周期

74 endsub

75 intpro tcpserverrecv //TCP服务器接收到客户端发送的数据产生中断

/*这里使用的是手机客户端网络调试助手,16进制HEX发送方式,模块接收到的数

据存放在D11开始寄存器,字节数在D60寄存器发送格式是(字节顺序):速度值

(圈/秒)+位置(圈)+速度值(圈/秒)+位置(圈)+......

*/

76         div d60 2 d60 //2个字节对齐,必须发送偶数个字节,字节顺序:速度值

//(圈/秒)+位置(圈)

77         mul d60 2 d60

78         if d60 //d60大于0,表示正常接收到数据

79         ​​​​​​​        mov 0 d63 //计数清零

80         ​​​​​​​        call sdsub //调用速度位置提取子程序

81        ​​​​​​​         call pidsub //调用pid重新初始化子程序

82         ​​​​​​​        timestart 0 0 1000 //启动定时器0,定时周期0.001S,

83         endif

84 endint

85 main //主程序

86         intinit s2 wifi //初始化wifi站点连接中断

87         wifiap "PCM" "12345678" s2 //初始化模块为WIFI热点,wifi名:PCM;

//密码:12345678;当有站点连接时会置位S2,产生中断

88         intinit s3 tcpserverint //初始化TCP服务器连接中断

89         intinit s4 tcpserverrecv //初始化TCP服务器接收数据中断

//初始化模块为TCP服务器,端口号为8000,D10保存客户端连接序列号,当有客户

//端连接时会把 S3 置位,执行tcpserverint中断程序

90         tcpserver 8000 d10 s3

/*马达位置PID设定,kp,ki,kd需要根据实际调试情况设定*/

91         mov 30.0 f90 //kp,f90=0.3

92         mov 0.0 f91 //ki,f91=0

93         mov 0 f92 //kd,f92=0.15

/*马达速度PID设定,kp,ki,kd需要根据实际调试情况设定*/

94         mov 30.0 f93 //kp,f93=0.3

95         mov 0.0 f94 //ki,f94=0

96         mov 0 f95 //kd,f95=0.15

97         mov 0 f81 //f81为马达位置设定值,单位:圈

98         mov 9 f86 //初始化马达正转最大速度

99         sub 0 f86 f87 //初始化马达反转最大速度

100         mov 224.51 f101 //编码器一圈11个脉冲,减速比20.41,马达转一圈224.51个

//脉冲

101         mov 0.001 f82 //pid运算的更新周期为0.001S

102         pidinit 0 f90 f91 f92 f82 //pid0初始化,f90为kp根据速度计算;f91为ki=0;

//f92为kd=0;f82为更新周期

103​​​​​​​        ​​​​​​​pidinit 1 f93 f94 f95 f82 //pid1初始化,f93为kp根据速度计算;f94为ki根据速度计

//算;f95为kd=0;f82为更新周期

/*有刷马达初始化*/

104         brushmoto 0 10000 //马达0初始化,pwm频率为10KHZ

105         mov 0 d4 //脉冲计数周期清零

106         mov 30000 d8 //设置最大值中断值为d8=30000个脉冲

107         intinit s0 int0 //中断初始化,当脉冲计数达到最大值时,s0置位,执行int0中断

//程序

/*初始化计数通道0,运行模式4,当CTR0脚是低电平时,SIG0接收到上升

沿,就加计数。当CTR0脚是高电平时,SIG0接收到上升沿,就减计数。

当产生中断时,S0置位,并且把中断状态值保存到D2寄存器

*/

108         pcntinit 0 4 D2 S0

//通道0,3表示设置最大值,最大值为d8=30000个脉冲,注意脉冲计数最大值为

//32767,设置值不要超过这个值

109         pcntsetval 0 2 -30000

110         pcntsetval 0 3 d8

111         pcntint 0 //开启通道0中断

112         intinit s1 int1 //中断初始化,当定时时间达到0.001S时,s1置位,执行int1中断

//程序

113         time 0 0 s1 //定时器0初始化为周期性定时器,定时时间到后S1会置1

114         pcntstart 0 //脉冲计数通道0开始计数

115         while 1 //无限循环

116         endwhile

117 endmain

程序中第1-38行为定时器定时中断程序,定时周期为1ms,在中断程序读取编码器的

计数值,计算马达速度及位置,然后使用速度PID运行和位置PID运算控制马达的以指定

的最大速度到达指定位置,位置单位为圈,速度单位为圈每秒;

第2-6行,读取编码器的计数脉冲,并计算马达当前的位置,单位为圈;

第7-12行,位置PID运算,使用当前位置与设定位置做PID运算,此PID输出作为后

面速度PID的设定值,所以位置PID与速度PID是做串级运算,先计算位置然后再计算速

度,所以位置PID输出的限幅为设定速度的最大最小值;

第13-22行,计算马达的速度,即把当前计算脉冲减去上周期的计数脉冲,然后除

以定时周期,即为马达的速度,单位圈每秒,此速度与位置PID的输出做PID运算,输出

即为控制马达速度的占空比值,此值再做+-100占空比的限幅,最后使用此值给马达移动

指令控制马达的旋转;

第23-37行,先判断马达是正转还是反转,然后再判断马达有没有到达设定位置,

如果到达指定位置,就读取下一组设定参数,参数规定为2个字节,第1字节为位置,单

位圈,第2个字节为速度,单位圈每秒,可以一次性设定多组数据,当马达到达一个位置

后,接着开始运行到下一个位置,直到所有设定位置运行完毕。下图69,就是一次性设

定了4个位置;

第39-45行,为脉冲计数中断程序,在主程序初始化的时候已经开启最大值与最小

值中断,最大值设定为30000个脉冲,最小值为-30000个脉冲,程序中先判断是最大值

中断还是最小值中断,如果为最大值中断,就把D4加1,如果为最小值中断,就把D4减

1;

第46-48行,WIFI站点连接中断程序,当有站点连接到本机时,输出提示信息;

第49-51行,TCP客户端连接中断程序,当有TCP客户端连接到本机时,执行此程

序,程序中初始化TCP服务器接收数据功能,并开启了中断,开启中断是在主程序中已

经初始化的;

第52-65行,为速度位置提前子程序,此程序把手机端发送过来的数据分解成速

度,位置值,并保存到相应寄存器中,每组速度位置用2字节表示,第1字节为速度,第2

字节表示位置,所以在手机端要发送偶数个字节,如果发送的是奇数字节,最后一个字

节会被舍弃。

第66-74行,为PID重新初始化子程序,本实验马达在不同的速度和位置运行时,使

用不同的PID参数,这个是要根据实际情况进行调试的,总体原则是速度越大,KP,KI值

越小;

第75-84行,TCP服务器接收数据中断程序,此程序接收TCP客户端发送过来的数

据,本实验使用的是手机上的网络调试助手。程序对接收的数据进行提取,2个字节一组

数据,第1字节代表速度,第2字节代表位置,依次类推。然后调用PID初始化子程序,

最后启动定时器,定时周期1ms,定时器启动后,马达就开始根据设定速度及位置开始运

行;

第85-117行,为主程序,主程序做一些初始化的工作;

第86-90行,初始化WIFI热点,开启TCP服务器连接中断,TCP服务器接收数据中

断,并初始化本机为TCP服务器;

第91-93行,马达位置PID参数设置;

第94-96行,马达速度PID参数设置;

第97-101行,马达位置寄存器初始化,正反转最大速度初始化,设定编码器转一圈

的脉冲数,本实验编码器转一圈的脉冲数为224.51(因为使用的是减速马达,减速比为

20.41,编码器一圈实际是11个脉冲),初始化定时周期寄存器为0.001,即1ms;

第102,103行,PID通道0,1初始化;

第104行,初始化有刷马达通道0,PWM频率为10KHz;

第105-111行,初始化脉冲计数通道0,运行模式4,开启最大值最小值中断,最大

值为30000,最小值为-30000;

第112,113行,初始化定时器0为周期性定时器,定时周期1ms,并开启中断;

第114行,启动脉冲计数通道0开始计数;

下图69为手机端网络调试助手发送的数据(16进制数据):01 14 02 00 03 28 04

00,第1字节01表示马达运行速度为1圈每秒,第2个字节14表示马达运行20圈,当马达

运行到20圈时,调用第3,4字节,第3节02表示速度为2圈每秒,第4字节00表示马达运行

到0圈的位置,即马达回到起始位置,当马达回到起始位置后,调用第5,6字节,第5字节

03表示速度为3圈每秒,第6字节28表示马达运行到40圈的位置,当马达运行到40圈位置

后,调用第7,8字节,第7字节04表示速度为4圈每秒,第8字节00表示马达运行到0圈位

置,实际上就是又回到起始位置。

这8个字节数据,马达以不同的速度,运行到指定位置,总共运行了4次。

图69         手机端APP网络调试助手

PCM开发板模块实验指导--有刷直流马达速度位置控制实验相关推荐

  1. PCM开发板模块实验指导--有刷直流马达速度控制实验

    模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762         43---有刷直流马达速度控制实验:            ...

  2. PCM开发板模块实验指导--有刷直流马达正反转实验

    模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762         42---有刷直流马达正反转实验:             ...

  3. PCM开发板模块实验指导--IIC主从实验

     模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762        25---IIC主读写固定寄存器地址实验:​​​​​​​ ...

  4. PCM开发板模块实验指导--触摸屏控制步进电机位置实验

    模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762         65---触摸屏控制步进电机位置实验:           ...

  5. PCM开发板模块实验指导--触摸屏控制步进电机速度实验

    模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762         64---触摸屏控制步进电机速度实验:           ...

  6. PCM开发板模块实验指导--SPI读写PSRAM64实验

    模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762         32---SPI读写PSRAM64实验实验:        ...

  7. Java语言程序设计实验指导_《java语言程序设计》上机实验指导手册(4).doc

    <java语言程序设计>上机实验指导手册(4).doc 1JAVA语言程序设计上机实验指导手册(4)2实验四JAVA面向对象编程1[目的]①通过编程和上机实验理解JAVA语言是如何体现面向 ...

  8. ameya30代理品牌尼得科电风扇专用无刷直流马达和扇叶模组

    高能效.小型轻便.兼具风量微调功能的电风扇在当今的家电产品领域中,越来越多的电器厂商开始从"节能省电"这一角度出发,重新对产品的功能进行改良.电风扇就是其中之一.与以往搭载交流马达 ...

  9. 单片微型计算机实验指导,单片微型计算机原及接口技术--实验指导书(w).doc

    单片微型计算机原及接口技术--实验指导书(w) 微型计算机原理与接口技术 (单片微型计算机原理及接口技术) 实验指导书 适用于微电子专业.测控专业必修课程 <微型计算机原理及接口技术>实验 ...

最新文章

  1. AttributeError: cannot assign module before Module.__init__() call
  2. 第二十二章:动画(十五)
  3. 【Android个人理解(八)】跨应用调用不同组件的方法
  4. springboot 2.0.5配置Druid连接池和web监控后台
  5. 树莓派运行python import os未找到命令_通过pip指令在树莓派上基于Python3安装OpenCV...
  6. 利用proc 实现内核和用户态交换数据
  7. Alwayson--问题总结二
  8. DLL入门浅析(3)——从DLL中导出变量
  9. 1.3 Go语言基础之数据类型
  10. nlp中的经典模型(三)
  11. linux-tar压缩与解压缩
  12. linux 磁盘控制器,linux – 戴尔R710上的PERC 6 / i RAID:单个控制器上的慢速磁盘…… RAID10?...
  13. 获取request的json数组对象
  14. 回溯法 —— 求解子集和问题
  15. markdown的标题设置自动添加序号
  16. 趣学Spring:一文搞懂Aware、异步编程、计划任务
  17. Gartner:2017年十大科技趋势盘点
  18. 计算机考研前沿知识怎么准备,2016考研复试面试前需充足准备9大内容
  19. php判断汉子首字母的函数,php获取汉字首字母的函数
  20. 直流输电模型基于pscad仿真软件的3端直流输电模型

热门文章

  1. ElasticSearch 监控单个节点详解
  2. 【.NET Core】 hangfire
  3. 男程序员怎么过妇女节
  4. 支持向量机通俗导论(理解SVM的三层境界)(3)以及参考文献
  5. AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0.
  6. python path包的使用详解
  7. swagger支持中英文
  8. 余三码和余三循环码的简单理解
  9. 介绍一款最受欢迎的.NET 开源UI库
  10. 查看oracle数据库(database)的版本命令