PCM开发板模块实验指导--有刷直流马达速度位置控制实验
模块推荐: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开发板模块实验指导--有刷直流马达速度位置控制实验相关推荐
- PCM开发板模块实验指导--有刷直流马达速度控制实验
模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762 43---有刷直流马达速度控制实验: ...
- PCM开发板模块实验指导--有刷直流马达正反转实验
模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762 42---有刷直流马达正反转实验: ...
- PCM开发板模块实验指导--IIC主从实验
模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762 25---IIC主读写固定寄存器地址实验: ...
- PCM开发板模块实验指导--触摸屏控制步进电机位置实验
模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762 65---触摸屏控制步进电机位置实验: ...
- PCM开发板模块实验指导--触摸屏控制步进电机速度实验
模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762 64---触摸屏控制步进电机速度实验: ...
- PCM开发板模块实验指导--SPI读写PSRAM64实验
模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762 32---SPI读写PSRAM64实验实验: ...
- Java语言程序设计实验指导_《java语言程序设计》上机实验指导手册(4).doc
<java语言程序设计>上机实验指导手册(4).doc 1JAVA语言程序设计上机实验指导手册(4)2实验四JAVA面向对象编程1[目的]①通过编程和上机实验理解JAVA语言是如何体现面向 ...
- ameya30代理品牌尼得科电风扇专用无刷直流马达和扇叶模组
高能效.小型轻便.兼具风量微调功能的电风扇在当今的家电产品领域中,越来越多的电器厂商开始从"节能省电"这一角度出发,重新对产品的功能进行改良.电风扇就是其中之一.与以往搭载交流马达 ...
- 单片微型计算机实验指导,单片微型计算机原及接口技术--实验指导书(w).doc
单片微型计算机原及接口技术--实验指导书(w) 微型计算机原理与接口技术 (单片微型计算机原理及接口技术) 实验指导书 适用于微电子专业.测控专业必修课程 <微型计算机原理及接口技术>实验 ...
最新文章
- AttributeError: cannot assign module before Module.__init__() call
- 第二十二章:动画(十五)
- 【Android个人理解(八)】跨应用调用不同组件的方法
- springboot 2.0.5配置Druid连接池和web监控后台
- 树莓派运行python import os未找到命令_通过pip指令在树莓派上基于Python3安装OpenCV...
- 利用proc 实现内核和用户态交换数据
- Alwayson--问题总结二
- DLL入门浅析(3)——从DLL中导出变量
- 1.3 Go语言基础之数据类型
- nlp中的经典模型(三)
- linux-tar压缩与解压缩
- linux 磁盘控制器,linux – 戴尔R710上的PERC 6 / i RAID:单个控制器上的慢速磁盘…… RAID10?...
- 获取request的json数组对象
- 回溯法 —— 求解子集和问题
- markdown的标题设置自动添加序号
- 趣学Spring:一文搞懂Aware、异步编程、计划任务
- Gartner:2017年十大科技趋势盘点
- 计算机考研前沿知识怎么准备,2016考研复试面试前需充足准备9大内容
- php判断汉子首字母的函数,php获取汉字首字母的函数
- 直流输电模型基于pscad仿真软件的3端直流输电模型
热门文章
- ElasticSearch 监控单个节点详解
- 【.NET Core】 hangfire
- 男程序员怎么过妇女节
- 支持向量机通俗导论(理解SVM的三层境界)(3)以及参考文献
- AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0.
- python path包的使用详解
- swagger支持中英文
- 余三码和余三循环码的简单理解
- 介绍一款最受欢迎的.NET 开源UI库
- 查看oracle数据库(database)的版本命令