步进电机的控制实验报告一、实验目的1.学习步进电机的工作原理。
2.了解步进电机的驱动电路。
3.学会用单片机控制步进电机。
二、实验器件1.T IVA C 系列芯片,电机模块和LCD显示模块。
2.电脑以及CCS开发软件。
三、实验内容设计一个简单的程序驱动步进电机并控制转速,通过LCD板上的滚轮装置可以调节步进电机的转速。
四、实验原理双极性四线步进电机:一般双极性四线步进电机线序是 A B A/ B/, 其中A 与A/是一个线圈,B和B/是一个线圈,一般这种驱动需要的是H桥电路。
H双极性四线步进电机驱动相序:1.单相四拍通电驱动时序正转: A/ B A B/反转: B/ A B A/2.双相通电四拍驱动时序正转:A/B AB AB/ A/B/反转:A/B/ AB/ AB A/B3.半步八拍驱动时序正转:A/ A/B B AB A AB/ B/ A/B/反转:A/B/ B/ AB/ A AB B A/B A/DRV8833驱动芯片: DRV8833为玩具、打印机及其他机电一体化应用提供了一款双通道桥式电机驱动器解决方案。
该器件具有两个H 桥驱动器,并能够驱动两个直流(DC)电刷电机、一个双极性步进电机、螺线管或其他电感性负载。
每个H桥的输出驱动器模块由N沟道功率MOSFET组成,这些MOSFET被配置成一个H桥,以驱动电机绕组。
每个H桥都包括用于调节或限制绕组电流的电路。
借助正确的PCB设计,DRV8833的每个H桥能够连续提供高达1.5-ARMS(或DC)的驱动电流(在25℃和采用一个5VVM电源时)。
每个H桥可支持高达2A的峰值电流。
在较低的VM电压条件下,电流供应能力略有下降。
该器件提供了利用一个故障输出引脚实现的内部关断功能,用于:过流保护、短路保护、欠压闭锁和过热。
另外,还提供了一种低功耗睡眠模式。
DRV8833内置于16引脚HTSSOP封装或采用PowerPAD™的QFN封装(绿色环保:RoHS和无Sb/Br)。
图1 H桥电路真值表设计思路:使用单相四拍通电驱动时序驱动步进电机。
用单片机生成四个占空比为25%相位逐个延迟90度的PWM信号,按照特定顺序输入到驱动芯片的AIN1、AIN2、BIN1、BIN2引脚。
通过调节LCD模块上的滚轮来调节PWM信号的周期从而控制步进电机的转速。
调节的频率范围是25HZ-50HZ。
步进电机的转速信息通过传感器采样送到单片机,信息处理后送到LCD显示模块显示。
实验主程序:int main(void){uint32_t pui32ADC0Value[1]; // 保存ADC采样值int speed = 0;uint32_t cur_Period, old_Period = 0; // 根据滚轮ADC转换值换算出当前的时间周期值// 系统时钟设置SysCtlClockSet(SYSCTL_SYSDIV_64 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);// 初始化滚轮Init_ADCWheel();// 使能LCDLCD_Enable();// 初始化LCDLCD_Init();// 清屏LCD_ScreenClr();// 显示“rpm 电机转速单位转/分”字符{LCD_Draw_Char('S', 0, 0);LCD_Draw_Char('p', 0, 8);LCD_Draw_Char('e', 0, 16);LCD_Draw_Char('e', 0, 24);LCD_Draw_Char('d', 0, 32);LCD_Draw_Char(':', 0, 40);}LCD_Draw_Char('(', 1, 127-40);LCD_Draw_Char('r', 1, 127-32);LCD_Draw_Char('/', 1, 127-24);LCD_Draw_Char('s', 1, 127-16);LCD_Draw_Char(')', 1, 127-8);//Enable PB0SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0);GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_PIN_0);while(1){SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);GPIODirModeSet(GPIO_PORTC_BASE,GPIO_PIN_7, GPIO_DIR_MODE_IN);GPIOPadConfigSet(GPIO_PORTC_BASE,GPIO_PIN_7,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_6, GPIO_DIR_MODE_IN);GPIOPadConfigSet(GPIO_PORTD_BASE, GPIO_PIN_6,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);if(GPIOPinRead(GPIO_PORTD_BASE,GPIO_PIN_6)==0){Init_PWM();}if(GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_7)==0){Init_PWM1();}初始化时,检测按键,实现正反转ADCProcessorTrigger(ADC_BASE, SequenceNum);// 等待完成取样转换while(!ADCIntStatus(ADC_BASE, SequenceNum, false))}// 清楚ADC中断标志位ADCIntClear(ADC_BASE, SequenceNum);// 读取ADC采样值ADCSequenceDataGet(ADC_BASE, SequenceNum, pui32ADC0Value);// 当前周期转化公式cur_Period = MIN_PERIOD + ((MAX_PERIOD - MIN_PERIOD) *pui32ADC0Value[0]) / 4096;// 记录ADC的变化率大小uint32_t temp = 0;if(cur_Period > old_Period){temp = cur_Period - old_Period;}else{temp = old_Period - cur_Period;// cur_Period = PERIOD_TIME;// ADC 实现16级的有极变化,if(temp > 0xFFF){// 调整周期// PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, cur_Period); // PWMGenPeriodSet(PWM0_BASE, PWM_GEN_1, cur_Period);// PWMGenPeriodSet(PWM1_BASE, PWM_GEN_2, cur_Period);// PWMGenPeriodSet(PWM1_BASE, PWM_GEN_3, cur_Period);//// // 调整占空比// PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, cur_Period / 2); // PWMPulseWidthSet(PWM0_BASE, PWM_OUT_2, cur_Period / 2); // PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, cur_Period / 4); // PWMPulseWidthSet(PWM0_BASE, PWM_OUT_2, cur_Period / 4); // PWMPulseWidthSet(PWM1_BASE, PWM_OUT_5, cur_Period / 4); // PWMPulseWidthSet(PWM1_BASE, PWM_OUT_6, cur_Period / 4); //////// // 延时调整// PWMSyncTimeBase(PWM0_BASE, PWM_GEN_1_BIT);// SysCtlDelay((cur_Period / 4) );// PWMSyncTimeBase(PWM0_BASE, PWM_GEN_0_BIT);// SysCtlDelay((cur_Period / 4));// PWMSyncTimeBase(PWM1_BASE, PWM_GEN_3_BIT);// SysCtlDelay((cur_Period / 4));// PWMSyncTimeBase(PWM1_BASE, PWM_GEN_2_BIT);//计算电机转数speed = ROM_SysCtlClockGet() / cur_Period;old_Period = cur_Period;}//计算频率并显示unsigned char number = '0';int i = 0 ;unsigned char data[4] = {0};data[0] = speed / 1000;data[1] = (speed / 100) % 10;data[2] = (speed / 10) % 10;data[3] = (speed / 1) % 10;// 如果ADC采样值发生变化则更新显示for(i = 0; i < 4; ++i){LCD_Draw_Char('.', 1, 20 + 10 * 2);if(i > 1)LCD_Draw_Char(number + data[i], 1, 20 + 10 * (i + 1)elseLCD_Draw_Char(number + data[i], 1, 20 + 10 * i);// 系统延时,一秒执行4次ROM_SysCtlDelay(SysCtlClockGet() / 12);}}五、实验调试1.将程序下载到单片机上。
2.运行程序,打开电机开关,这时候可以看到步进电机转动。
图2 步进电机转动3.调节滚轮可以调节步进电机的转速。