凌乱的DSP笔记(6)-直流电机&步进电机
1. 直流电机介绍
直流电机是指能将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。它是能实现直流电能和机械能互相转换的电机。
2. 硬件设计
TC1508S:
Hi-Z(高阻态):数字电路常见术语,指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,相当于没接。
3. 软件设计
3.1 dc_motor
/* * dc_motor.c * * Created on: 2020-4-8 * Author: Administrator */ #include "dc_motor.h" void DC_Motor_Init(void) { EALLOW; SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟 //DC_MOTOR 第1路端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO2=0; GpioCtrlRegs.GPADIR.bit.GPIO2=1; GpioCtrlRegs.GPAMUX1.bit.GPIO3=0; GpioCtrlRegs.GPADIR.bit.GPIO3=1; //DC_MOTOR 第2路端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO4=0; GpioCtrlRegs.GPADIR.bit.GPIO4=1; GpioCtrlRegs.GPAMUX1.bit.GPIO5=0; GpioCtrlRegs.GPADIR.bit.GPIO5=1; EDIS; GpioDataRegs.GPACLEAR.bit.GPIO2=1; GpioDataRegs.GPACLEAR.bit.GPIO3=1; GpioDataRegs.GPACLEAR.bit.GPIO4=1; GpioDataRegs.GPACLEAR.bit.GPIO5=1; }
/* * dc_motor.h * * Created on: 2020-4-8 * Author: Administrator */ #ifndef DC_MOTOR_H_ #define DC_MOTOR_H_ #include "DSP2833x_Device.h" // DSP2833x 头文件 #include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件 #define DC_MOTOR_INA_SETH (GpioDataRegs.GPASET.bit.GPIO2=1) #define DC_MOTOR_INA_SETL (GpioDataRegs.GPACLEAR.bit.GPIO2=1) #define DC_MOTOR_INB_SETH (GpioDataRegs.GPASET.bit.GPIO3=1) #define DC_MOTOR_INB_SETL (GpioDataRegs.GPACLEAR.bit.GPIO3=1) #define DC_MOTOR_INC_SETH (GpioDataRegs.GPASET.bit.GPIO4=1) #define DC_MOTOR_INC_SETL (GpioDataRegs.GPACLEAR.bit.GPIO4=1) #define DC_MOTOR_IND_SETH (GpioDataRegs.GPASET.bit.GPIO5=1) #define DC_MOTOR_IND_SETL (GpioDataRegs.GPACLEAR.bit.GPIO5=1) void DC_Motor_Init(void); #endif /* DC_MOTOR_H_ */
3.2 main.c
/* * main.c * * Created on: 2020年4月8日 * Author: lenovo */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #include "leds.h" #include "key.h" #include "dc_motor.h" /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { int i=0; char key=0; InitSysCtrl(); LED_Init(); KEY_Init(); DC_Motor_Init(); while(1) { key=KEY_Scan(0); switch(key) { case KEY1_PRESS: DC_MOTOR_INA_SETH;DC_MOTOR_INB_SETL;break; case KEY2_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETH;break; case KEY3_PRESS: DC_MOTOR_INA_SETL;DC_MOTOR_INB_SETL;break; } i++; if(i%2000==0) { LED1_TOGGLE; } DELAY_US(100); } }
如果驱动电流不足,可使用50%占空比方波驱动:
void main() { int i=0; char key=0; char flag=0; InitSysCtrl(); LED_Init(); KEY_Init(); DC_Motor_Init(); while(1) { key=KEY_Scan(0); switch(key) { case KEY1_PRESS: flag=1;break; case KEY2_PRESS: flag=2;break; case KEY3_PRESS: flag=0;break; } if(flag==1) { DC_MOTOR_INB_SETL; if(i%2==0) DC_MOTOR_INA_SETH; else DC_MOTOR_INA_SETL; } else if(flag==2) { DC_MOTOR_INA_SETL; if(i%2==0) DC_MOTOR_INB_SETH; else DC_MOTOR_INB_SETL; } else if(flag==0) { DC_MOTOR_INA_SETL; DC_MOTOR_INB_SETL; } i++; if(i%2000==0) { LED1_TOGGLE; } DELAY_US(100); } }
4. 效果
因为启动时电流不足,还需要手动拨一下
5. 步进电机介绍
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得步进电机在速度、位置等控制领域的控制操作非常简单。虽然步进电机应用广泛,但它并不像普通的直流和交流电机那样在常规状态下使用, 它必须由双环形脉冲信号、 功率驱动电路等组成控制系统方可使用。因此用好步进电机也非易事,它涉及机械、电机、电子及计算机等许多专业知识。
步进电机主要分为以下几类:
- 永磁式(PM)
- 反应式(VR)
- 混合式(HB)
步进电机主要技术指标如下:
- 相数
- 步距角
- 拍数
- 保持转矩
工作原理:
步进电机有三线式、四线式、五线式和六线式,但其控制方式均相同,都要以脉冲信号电流来驱动。假设每旋转一圈需要 200 个脉冲信号来励磁, 可以计算出每个励磁信号能使步进电机前进 1.8°。其旋转角度与脉冲的个数成正比。步进电动机的正、反转由励磁脉冲产生的顺序来控制。
步进电机的励磁方式分为全步励磁和半步励磁两种。其中全步励磁又有一相励磁和二相励磁之分, 半步励磁又称一二相励磁。
- 一相励磁:在每一瞬间,步进电机只有一个线圈导通.每送一个励磁信号,步进电机旋转 1.8°,这是三种励磁方式中最简单的一种。其特点是:精确度好、消耗电力小,但输出转矩最小,振动较大。
- 二相励磁:在每一瞬间,步进电动机有两个线圈同时导通。每送一个励磁信号,步进电机旋转 1.8°。其特点是:输出转矩大,振动小,因而成为目前使用最多的励磁方式。
- 一二相励磁:为一相励磁与二相励磁交替导通的方式。每送一个励磁信号,步进电机旋转 0.9°。其特点是:分辨率高,运转平滑,故应用也很广泛。
6. 软件设计
按键1:正转两周;按键2:反转两周;按键3:正转一下;按键4:反转一下。
/* * main.c * * Created on: 2020年4月8日 * Author: lenovo */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #include "leds.h" #include "key.h" #include "step_motor.h" //4(GPIO3),6(GPIO5),3(GPIO2),5(GPIO4) unsigned char Step_table_ZTurn[]={0xfff7,0xffdf,0xfffb,0xffef};//正转 unsigned char Step_table_FTurn[]={0xffef,0xfffb,0xffdf,0xfff7};//反转 /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { int i=0; char key=0; short cnt=0; char j=0; InitSysCtrl(); LED_Init(); KEY_Init(); Step_Motor_Init(); while(1) { key=KEY_Scan(0); if(key==KEY1_PRESS) { cnt=10; while(cnt--) { for(j=0;j<4;j++) { GpioDataRegs.GPADAT.all=Step_table_ZTurn[j]; DELAY_US(5000); } } } else if(key==KEY2_PRESS) { cnt=10; while(cnt--) { for(j=0;j<4;j++) { GpioDataRegs.GPADAT.all=Step_table_FTurn[j]; DELAY_US(5000); } } } else if(key==KEY3_PRESS) { for(j=0;j<4;j++) { GpioDataRegs.GPADAT.all=Step_table_ZTurn[j]; DELAY_US(5000); } } else if(key==KEY4_PRESS) { for(j=0;j<4;j++) { GpioDataRegs.GPADAT.all=Step_table_FTurn[j]; DELAY_US(5000); } } i++; if(i%2000==0) { LED1_TOGGLE; } DELAY_US(100); } }
7. 效果
为了观察明显,在转轴上绑了两条线绳……