liu_jing_yang 发表于 2010-2-26 16:45:08

三相细分步进电机控制器(高手进来,含源程序,KND步进控制器)

主板有两块芯片组成,主芯片为STM32公司的ARM系列,功能:主控制程序,比如发送脉冲,正转翻转,加减速等,从芯片为XILINX公司的CPLD型号为XC9572XL,经硬件形成3路信号PA,PB,PC进入CPLD,然后分6路输出,AH,AL,BH,BL,CH,CL到驱动板,即可控制电机运转。
我把CPLD这块的程序贴上,有做过步进控制器的给分析分析,不吝指教,先谢了! 目前的情况为电机可以转动,但在突然加减速的时候会出现丢步。
不知道有没有人用过或者做过KND步进电机控制器,原理同。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity pwm_2 is
port(clock,pa,pb,pc : in std_logic;
c39 : in std_logic;
c37 : out std_logic;
ah,al,bh,bl,ch,cl : out std_logic);
end;
                                                                                                                        
architecture dianji of pwm_2 is
signal q1 :std_logic_vector(7 downto 0) := "00000000";--死区发生器8位
signal q2 :std_logic_vector(7 downto 0) := "00000000";--
signal q3 :std_logic_vector(7 downto 0) := "00000000";--
signal dead_time :std_logic_vector(7 downto 0):= "00101101";--死区寄存器,死区时间3us45

begin
process(clock)
begin
if (clock'event and clock = '1') then
if ((pa = '1') and (q1 /=dead_time))then
q1 <= q1 + 1;
elsif ((pa = '0') and (q1 /= "00000000")) then
q1 <= q1 - 1;
end if;


if ((pa = '1') and (q1 = dead_time)) then --上桥臂导通
ah <= '1';                        
else
ah <= '0';
end if;


if((pa = '0') and (q1 ="00000000")) then --下桥臂导通
al <= '1';
else
al <= '0';
end if;
end if;
end process;

process(clock)
begin
if (clock'event and clock = '1') then
if ((pb = '1') and (q2 /=dead_time))then
q2 <= q2 + 1;
elsif ((pb = '0') and (q2 /= "00000000")) then
q2 <= q2 - 1;
end if;


if ((pb = '1') and (q2 = dead_time)) then --上桥臂导通
bh <= '1';                        
else
bh <= '0';
end if;


if((pb = '0') and (q2 ="00000000")) then --下桥臂导通
bl <= '1';
else
bl <= '0';
end if;
end if;
end process;

process(clock)
begin
if (clock'event and clock = '1') then
if ((pc = '1') and (q3 /=dead_time))then
q3 <= q3 + 1;
elsif ((pc = '0') and (q3 /= "00000000")) then
q3 <= q3 - 1;
end if;


if ((pc = '1') and (q3 = dead_time)) then --上桥臂导通
ch <= '1';                        
else
ch <= '0';
end if;


if((pc = '0') and (q3 ="00000000")) then --下桥臂导通
cl <= '1';
else
cl <= '0';
end if;
end if;
end process;
end;

astudent 发表于 2010-2-26 21:48:33

丢步,关注

TRINAMIC 发表于 2010-2-26 22:56:21

使用现成的3相驱动芯片吧
点击此处下载 ourdev_535478.pdf(文件大小:614K) (原文件名:tmc332_datasheet.pdf)

liu_jing_yang 发表于 2010-2-27 08:08:09

回复【1楼】astudent
丢步,关注
-----------------------------------------------------------------------

哥们,你也做步进控制器这块吗?有没有好的经验分享一下

liu_jing_yang 发表于 2010-2-27 08:09:52

回复【2楼】TRINAMIC 驱动天下
使用现成的3相驱动芯片吧
点击此处下载(原文件名:tmc332_datasheet.pdf)

-----------------------------------------------------------------------

哥们,多谢了。不过这个项目的电路板已经出来了,器件也已经 选定,是不能再更改了

TRINAMIC 发表于 2010-2-27 09:14:13

不客气

semonpic 发表于 2010-2-27 11:23:10

pa,pb,pc 三个信号是否有毛刺信号,是否是毛刺信号,干扰了下面这段程序,而使桥臂导通出先问题。建议加D触发器器试试。
if ((pa = '1') and (q1 = dead_time)) then --上桥臂导通
ah <= '1';                        
else
ah <= '0';
end if;


if((pa = '0') and (q1 ="00000000")) then --下桥臂导通
al <= '1';
else
al <= '0';
end if;
end if;

wqm8181 发表于 2010-2-27 12:00:06

我用过.........CPLD这块程序很好弄的.   不知楼主是哪的,要是近的话,我可以帮你测试一下.

liu_jing_yang 发表于 2010-2-27 13:06:20

回复【7楼】wqm8181 数控黑客
我用过.........CPLD这块程序很好弄的.   不知楼主是哪的,要是近的话,我可以帮你测试一下.
-----------------------------------------------------------------------

谢了哥们,找到行家了,这块CPLD应该是3路信号进六路信号出,我写的这个程序功能上、语句上正确吗?我用示波器测量PA,PB,PC这三路进CPLD的信号和6路上下臂驱动信号和资料上是一样的,但就是丢步,不知道哪里的原因。我想先解决CPLD这块,没问题了再处理单片机这块。我是山东潍坊的 ,不知你是哪里?下面是我的联系方式

wqm8181 发表于 2010-2-27 13:14:36

回复【8楼】liu_jing_yang
-----------------------------------------------------------------------
我是用VHDL编的.
丢步的原因很多.你能保证其它地方没问题?
我在北京.

liu_jing_yang 发表于 2010-2-27 13:28:44

回复【9楼】wqm8181 数控黑客
-----------------------------------------------------------------------

就三个方面吧,一个是CPLD这块,一个是单片机这块,再就是板子。
CPLD因为功能简单些所以写出这个程序来 调试好后就一直用着,没做改动;
单片机的程序处理了挺长时间,程序不断的修改,直到电机可以初步正常运转,但加减速会丢步;
主板应该是没问题的。
可能问题就出在单片机上,但我想先百分百的确定CPLD没问题,之后再处理单片机。
要不你给我个邮箱,我把单片机的程序发给你,你帮我分析下,开发软件为Keil.

wqm8181 发表于 2010-2-27 15:29:24

丢步是怎么丢的?是丢脉冲还是电机堵转?我邮箱wqm8181at163.com

liu_jing_yang 发表于 2010-2-27 16:10:43

回复【11楼】wqm8181 数控黑客
丢步是怎么丢的?是丢脉冲还是电机堵转?我邮箱wqm8181at163.com
-----------------------------------------------------------------------

一会我把ARM的程序给你发过去,问题是这样:空载时如果数控系统的X轴Z轴快速倍率为2000以下步进电机转动一切正常,如果调高XZ轴的快速倍率,空载时加速状态下从正转迅速变为反转就会堵转。如果加到车床上XZ轴跑起来会一卡一卡的。

guoxicun 发表于 2010-2-27 17:13:07

丢步有可能有干扰的

liu_jing_yang 发表于 2010-3-3 14:16:56

回复【13楼】guoxicun
丢步有可能有干扰的
-----------------------------------------------------------------------

刚才又连到数控上跑了下,电机没负载的情况下跑动很正常,加速转、正反转都可以,就是接上负载就出现丢步,一顿一顿的

TRINAMIC 发表于 2010-3-3 15:50:53

如果有种步进驱动芯片能做到像直流伺服那样在运动过程中可以根据电机的需要自动输出电流,这样的话电机就不会丢步了。

wqm8181 发表于 2010-3-3 16:24:03

回复【14楼】liu_jing_yang
回复【13楼】guoxicun
丢步有可能有干扰的
-----------------------------------------------------------------------
刚才又连到数控上跑了下,电机没负载的情况下跑动很正常,加速转、正反转都可以,就是接上负载就出现丢步,一顿一顿的
-----------------------------------------------------------------------

查查你的电流检测这块.把电流调大点试试.

liu_jing_yang 发表于 2010-3-23 10:37:04

回复【16楼】wqm8181 数控黑客
回复【14楼】liu_jing_yang
回复【13楼】guoxicun   
丢步有可能有干扰的
-----------------------------------------------------------------------
刚才又连到数控上跑了下,电机没负载的情况下跑动很正常,加速转、正反转都可以,就是接上负载就出现丢步,一顿一顿的
-----------------------------------------------------------------------
查查你的电流检测这块.把电流调大点试试.
-----------------------------------------------------------------------

电流调大了也一样, 还是会出现卡的情况

qwerttt 发表于 2010-3-24 10:55:58

转速调慢点呢,你的负载太大

armok 发表于 2010-3-24 11:09:20

liu_jing_yang 发表于 2010-3-24 11:14:58

回复【16楼】wqm8181 数控黑客
回复【14楼】liu_jing_yang
回复【13楼】guoxicun   
丢步有可能有干扰的
-----------------------------------------------------------------------
刚才又连到数控上跑了下,电机没负载的情况下跑动很正常,加速转、正反转都可以,就是接上负载就出现丢步,一顿一顿的
-----------------------------------------------------------------------
查查你的电流检测这块.把电流调大点试试.
-----------------------------------------------------------------------

回复【楼主位】liu_jing_yang
-----------------------------------------------------------------------

大家都来看看啊

sdram 发表于 2010-3-24 21:59:41

STM32F103不能自己产生带死区的差分PWM信号么?

liu_jing_yang 发表于 2010-3-31 22:00:15

回复【18楼】qwerttt
-----------------------------------------------------------------------

带车床的步进电机 有一定的负载能力的 不是负载的原因我感觉

liu_jing_yang 发表于 2010-3-31 22:03:32

回复【21楼】sdram
-----------------------------------------------------------------------

回复【21楼】sdram
STM32F103不能自己产生带死区的差分PWM信号么?
-----------------------------------------------------------------------

STM32产生PWM波形 形成三路进入CPLD从CPLD分成6路出来作为驱动 电路已经做好 就是用STM32+CPLD不知道大家用没用过KND的步进电机 看了就明白了

flybird2010 发表于 2010-4-6 00:55:10

不是高手,支持盖楼

wqm8181 发表于 2010-4-7 15:18:45

回复【23楼】liu_jing_yang
-----------------------------------------------------------------------

带载看看驱动的正弦波正不正常?

xky183 发表于 2010-4-7 19:38:47

STM32好像支持死区控制的吧?

liu_jing_yang 发表于 2010-4-9 08:34:53

回复【26楼】xky183
STM32好像支持死区控制的吧?
-----------------------------------------------------------------------
死区控制必须在CPLD里面做.....

liu_jing_yang 发表于 2010-4-9 08:36:17

回复【25楼】wqm8181 数控黑客
回复【23楼】liu_jing_yang
-----------------------------------------------------------------------
带载看看驱动的正弦波正不正常?
-----------------------------------------------------------------------

我的STM32的程序怎么样?哪里需要修改?

wqm8181 发表于 2010-4-19 17:02:53

回复【28楼】liu_jing_yang
-----------------------------------------------------------------------

你的程序可能有问题。你计算一下的中断总花的时间是多少。

kouxiangtang 发表于 2010-4-20 00:51:42

强悍啊!

cj85 发表于 2012-1-14 10:58:36

mark

cdlxzlp 发表于 2012-5-27 00:04:47

好东西,我还没弄明白,哈哈
页: [1]
查看完整版本: 三相细分步进电机控制器(高手进来,含源程序,KND步进控制器)