步进电机的控制实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
步进电机的控制实验报告
一、实验目的
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/B
3.半步八拍驱动时序
正转: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();
// 使能LCD
LCD_Enable();
// 初始化LCD
LCD_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 PB0
SysCtlPeripheralEnable(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);