上一篇中,笔者给大家介绍了如果使用定时器单片机输出固定频率的脉冲,那么这一讲我们就要来实际应用这个功能来做一些简单的控制了,那么在工业自动化控制中典型的应用应该就要算步进电机的控制了。关于步进电机的详细知识点,详见附件中的“步进电机及驱动器知识讲座”,这里笔者只是摘抄其中部分知识进行讲解。
首先,我们来看一下步进电机的控制原理图:
很明显,通过控制器产生脉冲信号,再经过步进电机驱动器将脉冲信号转化为步进电机的角位移,便可以让步进电机动起来了!接下来我们看下步进电驱动器的接线方法。步进电机驱动器有三种接线方式,即:共阳极接法、共阴极接法和差分方式接法,分别如下图所示:
控制器跟步进电机之前,一般都是通过光耦隔离的。至于这个限流电阻,就要看实际供电情况来选择要不要了!
再来看电机的接线方法,步进电机一般有四线、六线和八线三种,三种电机的接线方式如下图所示:
一般买电机的时候,厂家会给出具体的接线图,本例中,笔者就是用的8线步进电机并行告诉接法。驱动器采用的是共阳极接法。线路连接好了,接下来我们就要来分析代码部分了。
本例中,要实现的功能是这样的:当IN00有信号输入的时候,电机按照固定频率900HZ转动;当IN01有信号输入的时候,电机停止。动作确实很简单,实际程序实现起来也是很简单。首先肯定是让定时器产品900HZ的脉冲了:
#define Fre_Mhz 900 //900Hz
/**************** 定时器配置 ******************/
void Timer_config(void)
{
TIM_InitTypeDef TIM_InitStructure; //结构定义
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; //指定工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
TIM_InitStructure.TIM_Polity = PolityLow; //指定中断优先级, PolityHigh,PolityLow
TIM_InitStructure.TIM_Interrupt = ENABLE; //中断是否允许, ENABLE或DISABLE
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / Fre_Mhz/2); //初值
TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
Timer_Inilize(Timer0,&TIM_InitStructure); //初始化Timer0 Timer0,Timer1,Timer2,Timer3,Timer44
}
然后,便是通过一个位变量Motor_EN来当作脉冲的开关,当Motor_EN为1的时候,有脉冲输出;当Motor_EN为0的时候,关闭脉冲输出。
bit Motor_EN;
/********************* Timer0中断函数************************/
void timer0_int (void) interrupt TIMER0_VECTOR //1ms
{
if(Motor_EN)
{
OUT00 = !OUT00; //OUT00输出特定频率波形
}
else
{
OUT00 = 0;
}
}
然后,通过IN00和IN01的输入状态来控制Motor_EN的值,即:当IN00有信号输入的时候,让Motor_EN置1;当IN01有信号输入的时候,让Motor_EN清零;
if((!IN00)&&(!Start))
{
delay_ms(20);
if((!IN00)&&(!Start))
{
Start = 1;
Stop = 0;
Motor_EN = 1;
}
}
if((!IN01)&&(!Stop))
{
delay_ms(20);
if((!IN01)&&(!Stop))
{
Start = 0;
Stop = 1;
Motor_EN = 0;
}
}
最后,笔者给大家演示一下效果,完整源代码见附件:
源代码:
步进电机及驱动器知识讲座: