|
使用新唐M452LG6AE单片机实现电机控制,用到的资源有,串口,GPIO,定时器。原理图和PCB还有源代码如附件所示
单片机源程序如下:
- #include <stdio.h>
- #include <string.h>
- #include "M451Series.h"
- #include "core_cm4.h"
- #define PLL_CLOCK 72000000
- #define LED_delay 10000000/*绿灯闪亮时间间隔*/
- volatile uint8_t up_flag = 0;
- volatile uint8_t down_flag = 0;
- volatile uint8_t middle_flag = 0;
- volatile uint8_t sensor_flag = 0;
- volatile uint32_t IntStatus = 0;
- volatile uint8_t stop_flag = 2;
- void Delay(uint32_t delayCnt)
- {
- uint32_t i = 0;
- for(i = 0;i<delayCnt;i++);
- }
- void BEEP_ON(void)
- {
- PD7 = 1;
- }
- void BEEP_OFF(void)
- {
- PD7 = 0;
- }
- void BEEP_Onetime(void)
- {
- BEEP_ON();
- Delay(10000000);
- BEEP_OFF();
- }
- //舱门往上顶到上复位
- void Gate_foreword(void)
- {
- while(1)
- {
- while(stop_flag == 1);
- if(PD3 == 0)//顶到上复位开关
- {
- up_flag = 1;
- PE0 = 0;//绿灯亮
- PF2 = 1;//蓝灯灭
- Delay(50000000);
- PE0 = 1;//绿灯灭
- break;
- }
- PA1 = 0;//设置DIR,舱门往上跑
- PA0 = 1;
- Delay(10000);
- PA0 = 0;
- Delay(10000);
- }
- }
- void Gate_backward(void)
- {
- GPIO_CLR_INT_FLAG(PB, BIT1|BIT2|BIT3|BIT4);//清除下中断标志
- NVIC_EnableIRQ(GPB_IRQn);//一进入下落我就使能中断传感器
- while(1)//开始下落
- {
- while(stop_flag == 1);
- //如果此时有一个传感器为低,就说明它被挡住了,那我就停止先不下落
- //只要有一个传感器为0,就是说有东西遮住,就死在这里
- while(!((PB1==1)&&(PB2==1)&&(PB3==1)&&(PB4==1)))
- {
- PE0 = 0;//绿灯亮
- }
- PE0 = 1;//绿灯灭
- if(PD2 == 0)//中复位开关
- {
- middle_flag = 1;
- Gate_foreword();//往上跑到顶部并延时
- }
- if(PC3 == 0)//下复位开关
- {
- down_flag = 1;
- PE0 = 0;//绿灯亮
- PF2 = 1;//蓝灯灭
- Delay(50000000);
- PE0 = 1;//绿灯灭
- break;
- }
- PA1 = 1;//设置DIR,舱门往下跑
- PA0 = 1;
- Delay(10000);
- PA0 = 0;
- Delay(10000);
- }
- }
- void GPB_IRQHandler(void)
- {
- //只要有一个引脚有中断进来
- if(GPIO_GET_INT_FLAG(PB,BIT1|BIT2|BIT3|BIT4))
- {
- GPIO_CLR_INT_FLAG(PB, BIT1|BIT2|BIT3|BIT4);
- sensor_flag = 1;
- PF2 = 0;//蓝灯亮
- Gate_foreword();//向上运动到顶
- }
- else
- {
- /*清除所有PB中断*/
- PB->INTSRC = PB->INTSRC;
- }
- }
- //PC4开关中断
- void GPC_IRQHandler(void)
- {
- //只要有一个引脚有中断进来
- if(GPIO_GET_INT_FLAG(PC,BIT4))
- {
- GPIO_CLR_INT_FLAG(PC, BIT4);
- Gate_foreword();//向上运动到顶
- }
- else
- {
- /*清除所有PC中断*/
- PC->INTSRC = PC->INTSRC;
- }
- }
- void UART0_IRQHandler(void)
- {
- volatile uint8_t u8char = 0;
- IntStatus = UART0->INTSTS;
- //接收数据有效中断
- if(IntStatus & UART_INTSTS_RDAIF_Msk)
- {
- while(UART_IS_RX_READY(UART0))//RXFIFO有数据
- {
- u8char = UART_READ(UART0);
- while(UART_IS_TX_FULL(UART0));//TXFIFO无数据
- UART_WRITE(UART0,u8char);
- }
- if(u8char == 'y')
- {
- stop_flag = 0;
- }
- else if(u8char == 'n')
- {
- stop_flag = 1;//上升或者下降中间位置停
- }
- else
- {
- stop_flag = 2;// 到最底下停止
- }
- }
- else
- {
- UART0->INTSTS &= ~UART_INTSTS_RDAIF_Msk;
- }
- }
- void SYS_Init(void)
- {
- //使用内部的RC时钟振荡器
- CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
- //超时接收等待内部时钟稳定
- CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
- //设置HIRC为HCLK的时钟源并且HCLK没有分频HIRC
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
-
- /*使能外部高速晶振*/
- CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
- /*等待12MHz稳定*/
- CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
- /*切换HCLK的时钟源为外部晶振*/
- CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT, CLK_CLKDIV0_HCLK(1));
- //设置HCLK的频率,PLL 144MHz 但是HCLK得时钟源是PLL并且2分频
- CLK_SetCoreClock(PLL_CLOCK);
-
- SystemCoreClockUpdate();
-
- /*选择UART时钟源HXT*/
- CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
- /*使能UART的时钟*/
- CLK_EnableModuleClock(UART0_MODULE);
-
- /*PD0是UART_RXD PD1是UART_TXD*//*引脚复用*/
- SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD1MFP_Msk | SYS_GPD_MFPL_PD0MFP_Msk);
- SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD1MFP_UART0_TXD | SYS_GPD_MFPL_PD0MFP_UART0_RXD);
- }
- void UART0_Init(void)
- {
- SYS_ResetModule(UART0_RST);
- UART_Open(UART0, 115200);
- //使能了RDA中断,THRE中断和RXTO中断
- UART_EnableInt(UART0,(UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk));
- }
- void GPIO_Init(void)
- {
- GPIO_SetMode(PE, BIT0, GPIO_MODE_OUTPUT);
- PE0 = 1;//绿灯灭
- GPIO_SetMode(PF, BIT2, GPIO_MODE_OUTPUT);
- PF2 = 1;//蓝灯灭
- GPIO_SetMode(PD, BIT7, GPIO_MODE_OUTPUT);/*控制蜂鸣器输出,低灭高响*/
- BEEP_Onetime();//有源蜂鸣器
- /***********************************输出步进电机*********************************/
- GPIO_SetMode(PA, BIT0, GPIO_MODE_OUTPUT);//MOTOR1_A-
- GPIO_SetMode(PA, BIT1, GPIO_MODE_OUTPUT);//MOTOR1_DIR-
- GPIO_SetMode(PA, BIT2, GPIO_MODE_OUTPUT);//MOTOR2_A-
- GPIO_SetMode(PA, BIT3, GPIO_MODE_OUTPUT);//MOTOR2_DIR-
- /************************************输入开关***********************************/
- GPIO_SetMode(PD, BIT2, GPIO_MODE_INPUT);
- GPIO_SetMode(PD, BIT3, GPIO_MODE_INPUT);
- GPIO_SetMode(PC, BIT3, GPIO_MODE_INPUT);
- GPIO_SetMode(PC, BIT4, GPIO_MODE_INPUT);
- /**********************输入传感器***********************************************/
- GPIO_SetMode(PB, BIT0, GPIO_MODE_INPUT);
- GPIO_SetMode(PB, BIT1, GPIO_MODE_INPUT);
- GPIO_SetMode(PB, BIT2, GPIO_MODE_INPUT);
- GPIO_SetMode(PB, BIT3, GPIO_MODE_INPUT);
- GPIO_SetMode(PB, BIT4, GPIO_MODE_INPUT);
- GPIO_SetMode(PB, BIT5, GPIO_MODE_INPUT);
- GPIO_SetMode(PB, BIT6, GPIO_MODE_INPUT);
- GPIO_SetMode(PC, BIT0, GPIO_MODE_INPUT);
- GPIO_SetMode(PC, BIT1, GPIO_MODE_INPUT);
- GPIO_SetMode(PC, BIT2, GPIO_MODE_INPUT);
- /**********************配置中断*********************************************/
- GPIO_EnableInt(PB,0, GPIO_INT_FALLING);//传感器1 J8
- GPIO_EnableInt(PB,1, GPIO_INT_FALLING);//传感器1 J9
- GPIO_EnableInt(PB,2, GPIO_INT_FALLING);//传感器2 J10
- GPIO_EnableInt(PB,3, GPIO_INT_FALLING);//传感器3 J11
- GPIO_EnableInt(PB,4, GPIO_INT_FALLING);//传感器4 J12
- GPIO_EnableInt(PB,5, GPIO_INT_FALLING);//传感器4 J13
- GPIO_EnableInt(PB,6, GPIO_INT_FALLING);//传感器4 J14
-
- GPIO_EnableInt(PC,4, GPIO_INT_FALLING);//开关J4
- NVIC_EnableIRQ(GPC_IRQn);
-
- GPIO_SET_DEBOUNCE_TIME(GPIO_DBCTL_DBCLKSRC_LIRC, GPIO_DBCTL_DBCLKSEL_1024);
- GPIO_ENABLE_DEBOUNCE(PB,BIT1|BIT2|BIT3|BIT4);//去抖动
- GPIO_ENABLE_DEBOUNCE(PC,BIT4);//去抖动
- }
- int32_t main(void)
- {
- volatile uint32_t clock_fre = 0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
M452LG6AE_Gate.rar
(2.89 MB, 下载次数: 36)
原理图PCB.rar
(304.67 KB, 下载次数: 31)
|
|