Open Source--位置环 速度环 控制步进电机
想了想,还是开源吧,自己花了两天多的时间调出来的。PID 位置环、速度环控制步进电机,在起动和停止的时候会有相应的加速和减速的过程,目前测试的效果比较良好。
基本思路如下:
需要使用一个PMW、一个Counter,以及一个触发频率为1KHz的中断。在触发频率为1KHz的中断内部,完成所有PID相关的调整。
PositionPID位置环通过Counter得到的PWM输出的脉冲数与PositionPlantCommand的步数进行比较,从而输出速度。
此速度会做为VelociytPID的PlantCommand,最后输出VelocityPlantDreive,也就是需要调整的PWM频率。
关键的参数主要是两个PID的参数,目前我调整的参数适用于16细分下、最高15KHz的脉冲驱动频率,里面也注释了
将频率提高到20K需要调整的参数。
需要注意的事项:
1、一定要确保PWM的最低频率要比中断的频率低,否则不能正常的停止;
2、PositionPID不能有积分项,注释里面有说明;
3、目前我使用的计数器是16位的,因此只支持最大65535的步数,对于16细分,1.8度的电机,最大也就是20转的行程;
4、估计是让大多数坛友失望的了,我使用的MCU是英飞凌系列的,所以基本上想用的话都需要比较大的改动了;
5、调试的时候可以通过串口输出两个PID的输出,以方便调整PID的参数;
6、PID相关的资料参考的是《PID Without a PhD》;
7、有写的不好的地方请轻喷,还希望多多指点。
其它的好像就没有什么了。。。。。。
有需要的拿去吧!祝你好运!!!!
感谢分享! leifeng 发表于 2016-1-28 17:34
感谢分享!
{:lol:} 。。。。。 谢谢大神啊啊 谢谢分享。 下载了还没看,先谢谢你先。 楼主用的哪个系列的啊? PCBBOY1991 发表于 2016-1-28 23:46
楼主用的哪个系列的啊?
4500。。。。 673104326 发表于 2016-1-28 23:50
4500。。。。
不懂。。。。。。。。。。。。 PCBBOY1991 发表于 2016-1-28 23:52
不懂。。。。。。。。。。。。
Xmc4500..... 673104326 发表于 2016-1-28 23:52
Xmc4500.....
我是说这个单片机不懂。。。。。。。。。。。。。。
我会866。 PCBBOY1991 发表于 2016-1-28 23:54
我是说这个单片机不懂。。。。。。。。。。。。。。
我会866。
866 好像我不懂{:titter:}
都是C语言的时代了,好歹改一改应该都可以。主要是要有PWM和计数两个硬件功能。 673104326 发表于 2016-1-28 23:57
866 好像我不懂
都是C语言的时代了,好歹改一改应该都可以。主要是要有PWM和计数两个硬件功 ...
其实思路最重要。 不错呀,LZ研究一下运动控制,合并一下功能吧 已下载 看下 感谢楼主 gzhmcu 发表于 2016-1-29 08:35
不错呀,LZ研究一下运动控制,合并一下功能吧
步进电机的运动控制? 673104326 发表于 2016-1-29 08:53
步进电机的运动控制?
是这个意义{:victory:} gzhmcu 发表于 2016-1-29 08:55
是这个意义
暂时没这个想法,不过你可以把你关于步进电机运动控制的具体想法说出来看看{:lol:} 先下载看下能否看得懂。
谢谢LZ 开源就得支持,顶楼主{:lol:} 感谢楼主; 十分感谢楼主!!! 谢谢罗,,你的单片机有点高级啊,步进电机是那种类型的啊,是带编码和驱动的吗? 感谢楼主分享{:loveliness:} 1069182055 发表于 2016-1-29 10:19
谢谢罗,,你的单片机有点高级啊,步进电机是那种类型的啊,是带编码和驱动的吗? ...
裸机。。。。。。 673104326 发表于 2016-1-29 10:48
裸机。。。。。。
开源说下电机的驱动芯片吗? 1069182055 发表于 2016-1-29 14:00
开源说下电机的驱动芯片吗?
TMC260 。。。。。。 不用编码器的闭环? hmd420304805 发表于 2016-1-29 20:56
不用编码器的闭环?
是的,也可以加入编码器,把Counter的计数换成对编码器的计数。 673104326 发表于 2016-1-29 21:09
是的,也可以加入编码器,把Counter的计数换成对编码器的计数。
为什么我感觉无编码器的闭环不靠谱? 好东西不错 hmd420304805 发表于 2016-1-30 02:09
为什么我感觉无编码器的闭环不靠谱?
打个比喻:
一个严格服从命令的士兵,军官让他往前走下一步绝不会往前走两步,然后军官还是不放心,非要让他每走一走都要报告一下自己的位置。
问题来了,军官让他往前走1000步,他开始每走一步都报告一下自己的位置,突然士兵一直报告在500步的位置,然后军官也不管什么原因
导致士兵一直在500步的位置不动,并一直要求说走到1000步,走到1000步。最后士兵累死了,军官还在一直说走到1000步。。。。。。
导致步进电机丢步的原因,可能是力矩不够,也有可能是因某些外部因素导致不能动了。加了编码器的闭环对于第一种可能有效果,但最终的
精度如何却有待确定。而对于后面的情况,加入编码器只会让情况更糟,当然如果再加入相应的逻辑处理另说。
所以我觉得单纯的加入编码器也只是个心里安慰,而关键是要从根本上确保步进电机不能丢步,也就是要根据负载来调节电流,完成
这个闭环才有实在的意义。 {:lol:}有意思。值得研究研究
感谢楼主分享 673104326 发表于 2016-1-30 08:49
打个比喻:
一个严格服从命令的士兵,军官让他往前走下一步绝不会往前走两步,然后军官还是不放心,非 ...
这就是半闭环和全闭环的区别了,
伺服电机算是半闭环,终端因为其他原因造成误差,解决不了。
光栅尺属于全闭环,直接检测终端位置。 keil_c51 发表于 2016-1-30 10:12
这就是半闭环和全闭环的区别了,
伺服电机算是半闭环,终端因为其他原因造成误差,解决不了。
光栅尺属 ...
伺服电机是半闭环? 也是用的编码器?
公司好像有光栅尺,但没有玩过。。。。。。 正在学习步进电机,感谢楼主!
673104326 发表于 2016-1-30 08:49
打个比喻:
一个严格服从命令的士兵,军官让他往前走下一步绝不会往前走两步,然后军官还是不放心,非 ...
我的意思是说,你怎么检测到电机转了多少度的?类似无刷电机那种过零检测?麻烦科普。 673104326 发表于 2016-1-29 14:43
TMC260 。。。。。。
芯片挺高级啊。。但是电流不是很高啊{:lol:} 1069182055 发表于 2016-1-30 15:14
芯片挺高级啊。。但是电流不是很高啊
好像有人都和你说过了,我再给你重复一下。
想电流大,用TMC262,外置MOS管,我目前用的能最大到5A左右,在4A左右驱动85电机的时候板子能整体控制在50度左右。 hmd420304805 发表于 2016-1-30 14:40
我的意思是说,你怎么检测到电机转了多少度的?类似无刷电机那种过零检测?麻烦科普。 ...
1.8度,两相 200步电机,16细分驱动,也就3200步对应360度,走多少步自然能算出多少度。 感谢楼主分享 mark一下 673104326 发表于 2016-1-30 15:36
1.8度,两相 200步电机,16细分驱动,也就3200步对应360度,走多少步自然能算出多少度。 ...
那你这个怎么说是闭环?
就是个开环的能够接收脉冲数的驱动器而已啊。
真正的闭环是,有位置的返馈。也就是说给他动作指令的设备,必须知道他的位置。不管他是丢步,还是卡屎,还是其他什么故障。
我承认我理解错误了,以为是类似无刷那样的算法。能够不加反馈装置。都能知道准确位置。 hmd420304805 发表于 2016-1-30 17:30
那你这个怎么说是闭环?
就是个开环的能够接收脉冲数的驱动器而已啊。
真正的闭环是,有位置的返馈。也就 ...
哈哈,好吧,是我没讲清楚,你想的也有点复杂了。
应该算是个假闭环了,在保证不丢步的情况下,位置的“反馈”还是很准的。 673104326 发表于 2016-1-30 15:36
1.8度,两相 200步电机,16细分驱动,也就3200步对应360度,走多少步自然能算出多少度。 ...
细分只有16是不是有点低,这样没有噪声吗? 673104326 发表于 2016-1-30 15:28
好像有人都和你说过了,我再给你重复一下。
想电流大,用TMC262,外置MOS管,我目前用的能最大到5A左右 ...
{:lol:} {:lol:} 673104326 发表于 2016-1-30 08:49
打个比喻:
一个严格服从命令的士兵,军官让他往前走下一步绝不会往前走两步,然后军官还是不放心,非 ...
这种芯片有没有控制3相电机的啊{:lol:} 感谢分享! 1069182055 发表于 2016-2-1 08:48
这种芯片有没有控制3相电机的啊
换个思路,你为什么非得用三相的?
http://www.trinamic.com/_articles/_common/_files/TRINAMIC_Product_Guide.pdf自己看一下吧 673104326 发表于 2016-2-1 09:30
换个思路,你为什么非得用三相的?
http://www.trinamic.com/_articles/_common/_files/TRINAMIC_Prod ...
三相的驱动能力强一点,™说 这个芯片。。完全没用过不懂,,这么细的脚有那么大电流吗{:shutup:} 楼主,我的现在会出现在稳态下小幅震荡,这种情况下该如何调整参数呢? mark一下 996512682 发表于 2016-2-17 16:55
楼主,我的现在会出现在稳态下小幅震荡,这种情况下该如何调整参数呢?
稳态振荡?
没有驱动脉冲然后振荡? 673104326 发表于 2016-2-17 18:16
稳态振荡?
没有驱动脉冲然后振荡?
就是电机会运行到给定位置后,一直小幅左右晃动,肯定是有驱动脉冲才会动的。 支持一下,有空看看 996512682 发表于 2016-2-17 19:59
就是电机会运行到给定位置后,一直小幅左右晃动,肯定是有驱动脉冲才会动的。 ...
是不是你的PWM没有关掉。。。。。。
感觉不是PID的问题,如果PID的问题那就是会停不下来,一直往一个方向以最低脉冲频率运动,这种情况需要调大积分项。 soos 发表于 2016-2-17 21:12
支持一下,有空看看
希望你能真有空看看{:titter:} 673104326 发表于 2016-2-17 21:29
是不是你的PWM没有关掉。。。。。。
感觉不是PID的问题,如果PID的问题那就是会停不下来,一直往一个方 ...
谢谢楼主的回复,关于这两个环的PID参数怎么调节呢,先调哪一个或者有什么经验和规律可循吗? 虽然暂时用不上不过还是感谢分享 谢谢了 996512682 发表于 2016-2-17 22:05
谢谢楼主的回复,关于这两个环的PID参数怎么调节呢,先调哪一个或者有什么经验和规律可循吗? ...
过了年就快忘的差不多了。。。。。。
我是先调的速度环,然后调的位置环,速度环好调些,位置环相对麻烦些,经验差不多都写在注释里了。 marK 感谢楼主 673104326 发表于 2016-2-18 21:22
过了年就快忘的差不多了。。。。。。
我是先调的速度环,然后调的位置环,速度环好调些,位置环相对麻 ...
谢谢路飞大哥! 学习学习,谢谢 有没有用stm32实现了的分享下{:lol:}{:lol:}{:lol:} 1069182055 发表于 2016-2-19 14:38
有没有用stm32实现了的分享下
给你分享出来你自己不理解吸收了也没用 。。。。。。 673104326 发表于 2016-2-19 19:05
给你分享出来你自己不理解吸收了也没用 。。。。。。
好吧{:sweat:} {:sweat:} 楼主可否上个带负载的视频瞧瞧{:lol:}{:lol:}{:lol:} 貌似不是全的吧,思路还不是很明白,譬如速度和位置调节的pid算法,小弟才疏学浅真的没有看懂,能否解释一二,不胜感激 楼主的步进电机用在什么行业里面? suny1022 发表于 2016-2-24 00:41
貌似不是全的吧,思路还不是很明白,譬如速度和位置调节的pid算法,小弟才疏学浅真的没有看懂,能否解释一 ...
把楼主位提到的内容都仔细看一遍,尤其是我提到的那篇文档,我看书都看了不下5遍。。。。。
有些东西也不是我给你说一遍你就能懂,或者又是我能给你说明白的。 zhenglingo 发表于 2016-2-24 08:56
楼主的步进电机用在什么行业里面?
算是工控吧。。。。。。 加减速控制pi调节 好东西一定要顶顶顶!! 673104326 发表于 2016-2-24 09:13
把楼主位提到的内容都仔细看一遍,尤其是我提到的那篇文档,我看书都看了不下5遍。。。。。
有些东西也 ...
嗯,我懂了,应该是我没有研究过你说的书,我好好看看,里面有几个函数和变量貌似没有,譬如PWMSP001_HandleType* PWMHandlePtr....,所以不明白思路 本帖最后由 zpwkxg 于 2016-2-29 08:22 编辑
673104326 发表于 2016-2-18 21:22
过了年就快忘的差不多了。。。。。。
我是先调的速度环,然后调的位置环,速度环好调些,位置环相对麻 ...
673104326大侠:
1.大侠的步进电机的加减速控制是靠速度闭环来实现的对吗?还没来得及看代码,如果是这样,我的看法是:你这种方法和一往提及的梯形、S型的加速算法还是有区别的:S或梯形加减速仅位置“单闭环”,通过位置差推算出加减速参数,而你的方法是位置和速度双闭环PID实现,不知是否正确,请大侠指教。
2.速度闭环的测速是按照单位时间走的角度实现的吗?是否加上个测速传感器会更好?
3.您这种方法步进电机的噪声控制及效果如何,是否能上个视频,让大家饱饱眼福?
zpwkxg 发表于 2016-2-28 22:54
673104326大侠:
1.大侠的步进电机的加减速控制是靠速度闭环来实现的对吗?还没来得及看代码,如果是这 ...
1.大侠的步进电机的加减速控制是靠速度闭环来实现的对吗?还没来得及看代码,如果是这样,我的看法是:你这种方法和一往提及的梯形、S型的加速算法还是有区别的:S或梯形加减速仅位置“单闭环”,通过位置差推算出加减速参数,而你的方法是位置和速度双闭环PID实现,不知是否正确,请大侠指教。
2.速度闭环的测速是按照单位时间走的角度实现的吗?是否加上个测速传感器会更好?
3.您这种方法步进电机的噪声控制及效果如何,是否能上个视频,让大家饱饱眼福?
大侠就算了,只是屌丝一个。。。。。。你想的有点多了,搞的我都有点不知道该怎么回答了
1、2、首先不是闭环,更不是双闭环了,只是位置环用到了假闭环,通过对PWM的脉冲数进行计数,以达到对位置的“反馈”,当然也可以通过编码器实现此功能,这个先不考虑。位置环负责根据位置的“反馈”来输出速度。然后位置环(开环,没有任何速度反馈或者检测)实现对输出速度的调整,也达到较好的加速及减速控制,尤其是加速。因为位置环只是PD,所以输出会是一个阶越信号,如果你真的测试的话,你会发现加速会比较快,而减速的效果会比较好,就是因为这个阶越信号的问题,通过调节PID参数也不能很好的解决,你可以参考一下下面的图片里的曲线I。我在程序里又做了一个调节,使得加速的效果也比较好,也就是曲线II的效果,具体你看程序里的注释就知道了。
3、电机的噪声其实和步进电机的硬件驱动电路有很大关系,尤其是电流和相关的恒流斩波参数。至于加减速引起的噪声,我觉得还好,比较小,也不难听,控制效果也不错。视频就算了,如果你调好了,可以传上来看看。{:lol:} suny1022 发表于 2016-2-24 10:16
嗯,我懂了,应该是我没有研究过你说的书,我好好看看,里面有几个函数和变量貌似没有,譬如PWMSP001_Han ...
那几个函数当然没有了,有了估计你也不能用,那是需要根据你使用的MCU来编写相应的程序也实现相应的功能,具体的功能也很简单明了。
不知道你有什么进展了没?
感谢分享! 673104326 发表于 2016-2-29 10:23
1.大侠的步进电机的加减速控制是靠速度闭环来实现的对吗?还没来得及看代码,如果是这样,我的看法是:你 ...
太高深了,楼主。。阶跃信号都有到底是怎么理解的喃。。。太笨了{:cry:} 感谢楼主。。。! 1069182055 发表于 2016-2-29 16:02
太高深了,楼主。。阶跃信号都有到底是怎么理解的喃。。。太笨了
你如果不能把问题深入的理解一下,把我分享出来的东西好好的消化一下,然后问出一些有价值的问题,你就不要再刷存在感了。。。。。。 673104326 发表于 2016-3-1 09:07
你如果不能把问题深入的理解一下,把我分享出来的东西好好的消化一下,然后问出一些有价值的问题,你就 ...
请教楼主:代码中的两个PWMSP001_HandleType CNT001_HandleType 两个类型在哪里定义的? 或者:是什么类型? 先不管,MARK zpwkxg 发表于 2016-3-1 10:03
请教楼主:代码中的两个PWMSP001_HandleType CNT001_HandleType 两个类型在哪里定义的? 或者:是什么 ...
这个是我用的MCU编译环境自带的一些库函数及变量定义,这些都是结构体,比如说
typedef struct UART001_HandleType
{
USIC_CH_TypeDef* UartRegs;/** CMSIS defined structure for USIC module */
UART001_PinHandleType PinHandle; /*!< User selected TX & RX Port pins */
UART_ModeType Mode;/** USIC Operation mode */
UART_StopBitType StopBit; /** No of stopbit selected */
UART_ParityType Parity;/** Parityselected */
uint32_t BaudRate; /** Desired baud rate */
uint16_t DataBits;/** Word Length */
bool TxFifoEn; /** Enable additional Transmit FIFO buffer capability */
bool RxFifoEn;/** Enable additional Receive FIFO buffer capability */
uint8_t TxLimit;/** TX FIFO Trigger value */
uint8_t RxLimit; /** RX FIFO Triger value */
uint8_t TxFifoSize; /** Tx FIFO Size value */
uint8_t RxFifoSize;/** Rx FIFO Size value */
bool RecvNoiseEn;/** Enable Receiver Noise Interrupt */
bool FormatErrEn;/** Enable Format Error Interrupt */
bool FrameFinEn;/** Enable Frame Finished Interrupt */
uint16_t BGR_STEP;/** Calculated step value */
uint16_t BGR_PDIV;/** Calculated pdiv value */
uint16_t BGR_DCTQ;/** Calculateddctq value */
uint16_t BGR_SP;/** Calculatedsampling point value
*/
uint8_t BGR_PCTQ;/** Calculatedpctq value */
}UART001_HandleType;
看了都头大,但这些不重要,重要的是你要在你的MCU上自己写相应的函数来实现同样的功能。一个是PWM的打开、调频、关闭,再有就是计数功能,对PWM的输出进行计数。。。。。。 MARK,谢谢楼主慷慨分享~ 再次感谢楼主。。。。! {:lol:}{:lol:}{:lol:},留个爪。 多谢楼主分享! stevenniu500 发表于 2016-3-18 11:07
,留个爪。
欢迎留爪{:lol:} 谢谢分享 好东西不错 不知道理解的对不对。在1khz中断里调用 HandleMotorControl,在接受新的电机位置指令后的地方调用WriteMotorPosition 本帖最后由 myqiang1990 于 2016-3-22 21:27 编辑
1069182055 发表于 2016-2-29 16:02
太高深了,楼主。。阶跃信号都有到底是怎么理解的喃。。。太笨了
太简单了,可以这么理解:说就信号在某时刻没有任何过程的跳变就是阶跃信号{:lol:} xuxueliang 发表于 2016-3-22 21:07
不知道理解的对不对。在1khz中断里调用 HandleMotorControl,在接受新的电机位置指令后的地方调用WriteMoto ...
对,就是这个意思。。。。。 myqiang1990 发表于 2016-3-22 21:16
太简单了,可以这么理解:说就信号在某时刻没有任何过程的跳变就是阶跃信号...
你不要逗他了{:titter:} 楼主,想了一天,我怎么也想不明白这个PWM脉冲的个数是怎样来记忆的。单片机PIC33FJ256MC710,控制方式是脉冲+方向。昨天我看这单片机资料里关于PWM这一章里的内容,是不是要设置个PWM中断,然后设置个变量。每中断一次,这个变量就累加一个数,来作为步进电机步数的增加呢?感觉好像也不是这样。2一个就是,从网上看资料,说是设置个外部中断,每检测到一个高电平,就累加一次来记忆PWM的脉冲数。搞的我也是一头雾水。 myqiang1990 发表于 2016-3-22 21:16
太简单了,可以这么理解:说就信号在某时刻没有任何过程的跳变就是阶跃信号...
{:lol:} 这个意思啊,比书上明白多了 myqiang1990 发表于 2016-3-22 21:16
太简单了,可以这么理解:说就信号在某时刻没有任何过程的跳变就是阶跃信号...
{:lol:} 这个意思啊,比书上明白多了
页:
[1]
2