嵌入式步进电机课程设计实验.docx
课程设计课程名称嵌入式系统原理题目名称基于ARM的步进电机的实现学生学院自动化学院专业班级:13级物联网工程1班学号.学生姓名指导教师张小波2023年12月25日一、课题应用现状及应用分析随着微电子和计算机技术的开展,步进电机的要求量与日俱增,它广泛用于打印机、电动玩具等消费类产品以及数控机床、工业机器人、医疗器械等机电产品中,其在各个国名经济领域都有应用。研究步进电机的控制系统,对提高控制精度和响应速度、节约能源等都具有重要意义。本控制系统的设计,有硬件设计和软件设计两局部组成。其中,硬件设计主要包括单片机最小系统、键盘控制模块、步进电机驱动模块、数码显示模块等功能模块的设计,以及硬件电路在电路板上的实现。软件设计包括主程序以及各个模块的控制程序,最总实验对步进电机转动方向及转动速度的控制,并且将步进电机的转动速度动态显示在LED数码管上。二、功能模块介绍及总体设计;(一)模块介绍:1、ARM嵌入式开发板本课程设计所用到的是AlientekMiniSTM32开发板,该开发板采的的是STM32FlO3RCT6芯片;SPIFLASH芯片是W25Q64,容量为8M字节;配备有LCD模块接口和三个功能按钮。2、步进电机(1)工作原理:步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而到达准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而到达调速的目的。(2)驱动方式:相励磁法:每一瞬间只有一个线圈导通,其他线圈休息。其特点是励磁方法简单,耗电低,精确度良好。但是力矩小、震动大,每次励磁信号走的角度是标称角度。相励磁法:每一瞬间有两个线圈同时导通,特点是力矩大、震动较小,每次励磁转动角度是标称角度。相励磁法:1相和2相轮流交替导通,精度较高,且运转平滑。每送一个励磁信号转动二分之一标称角度。有称为半步驱动。4相电机中,1、2种方式称4相4拍,3种称4相8拍。按钮:在MiniSTM32开发板上的按键KEYO连接在PC5上、KEYI连接在PA15上、WKjJP连接在PAo上。如下图:LCD实现流程:(二)、方案设计:分配五个输出IO口给步进电机控制,三个按键分别输入“转动/停止"、"一档/二档"、"正传/反转"信号,记录电机当前运行状态输出到LCD模块。三、系统硬件平台及接口设计;硬件平台:ALlENTEKMiniSTM32开发板接口色合计: 定MPA4-8为推挽输出,作为步进电机的信号输入口; 定义PAO为输入'作为按钮”开始/停止"入口,PC5为输出'作为按钮“一档/二档"的入口,PA15为'输入'作为按钮“正转/反转”的入口; LCD接口:LCD_LED对应PClO;LCD_CS对应PC9;LCD_RS对应PC8;LCD_WR对应PC7;LCD_RD对应PC6;LCD对应PB15:0;四、流程图及康代码(一)程序流程图:1、主程序及主循环:u8modle20="MODE:null"u8ifplay15="STATE:stop"intmain(void)Stm32_CIoCknit(9);系统时钟设置delayjnit(72);延时初始化UartJnit(72,9600);串口初始化MOTORJnit();初始化motorEXTIJnitO;外部中断初始化LCDJnitO;LED8=1;POINT_COLOR=BLACK;LCD_ShowString(30,40,200,24,24,“STATE:stop”);LCD-ShowString(30J0,200z24z24,MODExlockwise");LCD_ShowString(30,91,200,24,24,“SPEED:0“);POINT_COLOR=RED;LCD-ShowString(IOl,40,200,24,24JStOp");LCD_ShowString(IOl,70,200,24,24JdoCkWise");LCD_ShowString(101,91,200,24,24J(T);keyl=O;MOTOR_Stop();/motorstopwhile(l)(printf(',OKrn");while(key2=0)(MOTOR_Stop();)switch(key)case0:pay();break;opa();case1:break;)2、按钮初始化及其中断程序:按键初始化函数/PAO.15和PC5设置成输入voidKEYJnit(void)(RCC->APB2ENR=1<<2;RCC->APB2ENR=1<<4;JTAG_Set(SWD_ENABLE);GPIOA->CRLA=OXFFFFFFFO;GPIOA->CRL=0X00000008;GPIOA->CRHfc=OXOFFFFFFF;GPIOA->CRH=0X80000000;GPIOA->ODR=1<<15;GPIOC->CRIA=OXFFOFFFFF;GPIOC->CRL=0X00800000;GPI0C->0DR=l<<5;使能PORTA时钟使能PORTC时钟关闭JTAG,开启SWD/PAO设置成输入/PA15设置成输入/PA15上拉,PAO默认下拉/PC5设置成输入/PC5上拉u8KEY_Scan(u8mode)staticu8key_up=l;按键按松开标志if(mode)key_up=l;支持连按if(key_up&&(KEY0=0|KEYl=OWK.UP=1)(delay_ms(10);去抖动key_up=0;if(KEYO=O)returnKEYO_PRES;elseif(KEYl=O)returnKEY1_PRES;elseif(WK_UP=1)returnWKUP_PRES;elseif(KEYO=1&&KEY1=1&&WK_UP=O)key.up=l;return0;/无按键按下)3、步进电机初始化及正转函数:voidMOTOR-Init(Void)RCC->APB2ENR=1<<2;使能PORTA时钟RCC->APB2ENR=1<<5;使能PORTD时钟GPloAACRL&=OXooOOFFFF;GPIOA->CRL=OX11110000yPA8推挽,出PA2LED推挽,出GPlOAACRHa=oxfffffffo;GPIOA->CRH=0X00000001;GPloA->ODRI=IV<8;GPIOA->ODR=1<<4;/PA8,出高GPI0A->0DR=1<<5;GPI0A->0DR=1<<6;/PA8,出高GPI0A->0DR=1<<7;GPIOD->CRLA=OXFFFFFOFF;GPIQD->CRL|=0X00(X)0300y/PD.2GPI0D->0DR=1<<2;/PD2)voidMOTOkStoP(VOld)MOTORI=O;MOTOR2=0;MOTOR3=0;MOTOR4=0;)voidplay(XM0T0R1=1;MOTOR2=0;MOTOR3=0;MOTOR4=0;delay.ms(key1);MOTOR1=1;M0T0R2=1;MOTOR3=0;MOTOR4=0;delayJnS(Rey1);MOTORI=O;M0T0R2=1;MOTOR4=0;delay_ms(key1);MOTORI=O;MOTOR2=1;MOTOR3=1;MOTOR4=0;/LED8=!LED8;delay_ms(key1);MOTORI=O;MOTOR2=0;MOTOR3=1;MOTOR4=0;delay_ms(key1);MOTORI=O;MOTOR2=0;MOTOR3=1;MOTOR4=1;dlay-ms(ky1);MOTORI=O;MOTOR2=0;MOTOR3=0;MOTOR1=1;MOTOR2=0;MOTOR3=0;MOTOR4=1;delay_ms(key1);)voidOPlayO(同理将play()里序反过来就行)3、LCD显示程序:外部中断。效劳程序voidEXTIOJRQHandIer(Void)(delay.ms(10);消抖if(WK_UP=l)/WK_UP按键(key2=!key2;if(key2=0)LED=I;LCD_ShoWString(IOl,40,200,24,24,“stop");LCD-ShowString(IOl,91,200,24,24,1,0");elseLED=O;LCD-ShowString(1010,200,24,24z,work");if(keyl=3)LCD_ShoWStringUOl,91,200,24,24,"quick”);elseif(keyl=10)LCD-ShowString(IOl,91,200,24,24,"slow");)EXTI->PR=1<<O;去除LINEO上的中断标志位)外部中断95效劳程序voidEXTI9_5JRQHandIer(VOid)If(KEYO=O)按键0(if(keyO=O)key=l;LCD_ShowString(IOl,70,200,24,24,"anticlockwise");elseif(key=l)keyO=O;LCD-ShowString(Iol,70,200,24,24,"clockwise");)EXTI->PR=1<<5;去除LINE5上的中断标志位)外部中断1510效劳程序voidEXTII5_10RQHandler(Void)delay_ms(10);消抖If(KEYl=O)按键1if(key2=l)if(keyl=10)(keyl=3;LCD-ShowString(101,91200,24,24z"quick");elsekeyl=10;LCD-ShowString(101,91,200,24,24z"slow)EXTI->PR=1<<15;去除LINE15上的中断标志位)外部中断初始化程序初始化PA0,PC5,PA15为中断输入.voidEXTI_lnit(void)(KEYJnit();Ex-NVIC.Config(GPIO,AARTIR);上升沿触发Ex_NVIC_Config(GPIO_C,5,FTIR);下降沿触发Ex_NVIJCOnfig(GPIO_A,15,FTIR);下降沿触发MY.NVICJnit(2,2,EXTI0JRQnz2);抢占2,子优先级2,组2MY-NVICJnit(2,lzE×TI9-5JRQn,2);抢占2,子优先级1,组2MY,NVICJnit(2AEXTI15-10-IRQnz2);抢占2,子优先级0,组2)五、实验测试、结果分各个功能均实现,运行正常,经老师检查通过。六、总结、心得体会经过这个学期对ARM的学习,并且在老师的悉心指导下和严格要求下,我们总于完成了步进电机设计课程。从书本上的知识到自己亲手的课程设计,每一步对我们来说无疑是巨大的尝试和挑战。七、附主要的参考文献1楚荣珍,周向宁,张鹏“嵌入式步进电机控制系统的设计与实现“;2百度百科词条一“嵌入式系统"I3百度百科词条一“步进电机“,