|
使用新唐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)
2017-6-22 14:39 上傳
點擊文件名下載附件
原理圖PCB.rar
(304.67 KB, 下載次數: 31)
2017-6-22 14:42 上傳
點擊文件名下載附件
|
|