如果 你在做步进电机的控制,请你留下看一看,相信我走过的弯路能够对你有帮助,同时也希望你能够提出宝贵的意见
前段时间做了一个工程
主要要求是 1、4路步进电机的定位 (两路同步) 2、 与上位机通讯(昆仑通态MODBUS) 3、 一些简单 动作控制
说说我的板子配置
CPU:c8051f340 48MHZ
数字量输入: 19路 24V 光耦隔离
数字量输出:8路三极管输出(可直接接外部继电器)
电机控制: 4路步进电机控制接口(4x高速脉冲(PLUS)、4x方向(Dir))
模拟量输出:1路0-10v 模拟量输出(pwm)
对外接口:支持modbus的串口 X1 USB X1
好了接下来看板子
未命名.jpg (56.84 KB, 下载次数: 0)
下载附件
曲线
2012-7-15 20:08 上传
(中断处理程序在下面,敬请高手指点!)
最后请高手赐教
1、这样处理会不会有潜在的BUG (所指的是中断过长,频繁中断),有没有更低的CPU占用的控制办法?
2、在里面需不需要关闭中断?各个中断优先级要做何种处理?(系统中有多个中断 串口中断 一个系统滴答中断 一个PWM占空比调整中断)
3、根据处理能力计算,能否实现4轴同步运动(2000脉冲电机转一周,最高转速350RPM,最大定时器载入值为0xEFFA)?
4、如果要升级主控,选择何种CPU( stm32)?
5、有没有人愿意合作,把这个东西变成PLC,支持T形图编程?(我可负责CPU固件设计,可开源)
void Timer2_ISR (void) interrupt 5 //该中断处理是否太过冗长复杂?
{
TMR2CN &= ~1<<7; //清中断标志 关定时器
if(T2_runflag) //中断有效标志(急停 回原点 完成定位用)
{
if(UDM)PLU3=!PLU3; //电平翻转
if(TABM)PLU1=!PLU1;
if(l1==0) TMR2RL=WaitTable[l3]; //查加速曲线表表
if(steps1-nsteps1<t1) {if(l1<7) l1++;else {l1=0;if(l3<v1)l3++;}} //如果是加速段--- 正向查表 每一级发7个脉冲
if(nsteps1<t1) {if(l1<7) l1++;else {l1=0;if(l3>v0_1)l3--;}} //如果是减速段--- 反向查表
nsteps1--; //计步器
if(nsteps1>0) TMR2CN |= 1<<2; //开定时器
if(nsteps1==0) T2_runflag=0; //中断有效标志(急停 回原点 完成定位用)
if(UDM)PLU3=!PLU3; // 根据步进驱动器参数可知 高电平大于1.5US 则算是一个脉冲
if(TABM)PLU1=!PLU1; // 则可以在处理之前翻转一次 处理最后翻转一次
}
}
一周热门 更多>