久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10215|回復: 2
收起左側

新唐M452LG6AE單片機實現電機控制 原理圖和PCB程序

[復制鏈接]
ID:189392 發表于 2017-6-22 14:42 | 顯示全部樓層 |閱讀模式
使用新唐M452LG6AE單片機實現電機控制,用到的資源有,串口,GPIO,定時器。原理圖和PCB還有源代碼如附件所示
0.png 0.png

單片機源程序如下:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "M451Series.h"
  4. #include "core_cm4.h"
  5. #define PLL_CLOCK     72000000
  6. #define LED_delay     10000000/*綠燈閃亮時間間隔*/
  7. volatile uint8_t up_flag = 0;
  8. volatile uint8_t down_flag = 0;
  9. volatile uint8_t middle_flag = 0;
  10. volatile uint8_t sensor_flag = 0;
  11. volatile uint32_t IntStatus = 0;
  12. volatile uint8_t stop_flag = 2;
  13. void Delay(uint32_t delayCnt)
  14. {
  15.     uint32_t i = 0;
  16.                 for(i = 0;i<delayCnt;i++);
  17. }
  18. void BEEP_ON(void)
  19. {
  20.         PD7 = 1;
  21. }
  22. void BEEP_OFF(void)
  23. {
  24.         PD7 = 0;
  25. }
  26. void BEEP_Onetime(void)
  27. {
  28.         BEEP_ON();
  29.         Delay(10000000);
  30.         BEEP_OFF();
  31. }
  32. //艙門往上頂到上復位
  33. void Gate_foreword(void)
  34. {
  35.         while(1)
  36.         {
  37.                 while(stop_flag == 1);
  38.                 if(PD3 == 0)//頂到上復位開關
  39.                 {
  40.                         up_flag = 1;
  41.                         PE0 = 0;//綠燈亮
  42.                         PF2 = 1;//藍燈滅
  43.                         Delay(50000000);
  44.                         PE0 = 1;//綠燈滅
  45.                         break;
  46.                 }
  47.                 PA1 = 0;//設置DIR,艙門往上跑
  48.                 PA0 = 1;
  49.                 Delay(10000);
  50.                 PA0 = 0;
  51.                 Delay(10000);
  52.         }
  53. }
  54. void Gate_backward(void)
  55. {
  56.   GPIO_CLR_INT_FLAG(PB, BIT1|BIT2|BIT3|BIT4);//清除下中斷標志
  57.         NVIC_EnableIRQ(GPB_IRQn);//一進入下落我就使能中斷傳感器
  58.         while(1)//開始下落
  59.   {
  60.                 while(stop_flag == 1);
  61.                 //如果此時有一個傳感器為低,就說明它被擋住了,那我就停止先不下落
  62.                 //只要有一個傳感器為0,就是說有東西遮住,就死在這里
  63.                 while(!((PB1==1)&&(PB2==1)&&(PB3==1)&&(PB4==1)))
  64.                 {
  65.                                 PE0 = 0;//綠燈亮
  66.                 }
  67.                 PE0 = 1;//綠燈滅
  68.                 if(PD2 == 0)//中復位開關
  69.                 {
  70.                         middle_flag = 1;
  71.                         Gate_foreword();//往上跑到頂部并延時
  72.                 }
  73.                 if(PC3 == 0)//下復位開關
  74.                 {
  75.                         down_flag = 1;
  76.                         PE0 = 0;//綠燈亮
  77.                         PF2 = 1;//藍燈滅
  78.                         Delay(50000000);
  79.                         PE0 = 1;//綠燈滅
  80.                         break;
  81.                 }
  82.                 PA1 = 1;//設置DIR,艙門往下跑
  83.                 PA0 = 1;
  84.                 Delay(10000);
  85.                 PA0 = 0;
  86.                 Delay(10000);
  87.         }
  88. }
  89. void GPB_IRQHandler(void)
  90. {
  91.                 //只要有一個引腳有中斷進來
  92.     if(GPIO_GET_INT_FLAG(PB,BIT1|BIT2|BIT3|BIT4))
  93.     {
  94.                           GPIO_CLR_INT_FLAG(PB, BIT1|BIT2|BIT3|BIT4);
  95.                                 sensor_flag = 1;
  96.                                 PF2 = 0;//藍燈亮
  97.                                 Gate_foreword();//向上運動到頂
  98.     }
  99.     else
  100.     {
  101.         /*清除所有PB中斷*/
  102.         PB->INTSRC = PB->INTSRC;
  103.     }
  104. }
  105. //PC4開關中斷
  106. void GPC_IRQHandler(void)
  107. {
  108.         //只要有一個引腳有中斷進來
  109.   if(GPIO_GET_INT_FLAG(PC,BIT4))
  110.   {
  111.                 GPIO_CLR_INT_FLAG(PC, BIT4);
  112.                 Gate_foreword();//向上運動到頂
  113.    }
  114.    else
  115.    {
  116.       /*清除所有PC中斷*/
  117.       PC->INTSRC = PC->INTSRC;
  118.    }
  119. }
  120. void UART0_IRQHandler(void)
  121. {
  122.          volatile uint8_t u8char = 0;
  123.          IntStatus = UART0->INTSTS;
  124.          //接收數據有效中斷
  125.          if(IntStatus & UART_INTSTS_RDAIF_Msk)
  126.          {
  127.                         while(UART_IS_RX_READY(UART0))//RXFIFO有數據
  128.                         {
  129.                                 u8char = UART_READ(UART0);
  130.                                 while(UART_IS_TX_FULL(UART0));//TXFIFO無數據
  131.                                 UART_WRITE(UART0,u8char);
  132.                         }
  133.                         if(u8char == 'y')
  134.                         {
  135.                                 stop_flag = 0;
  136.                         }
  137.                         else if(u8char == 'n')
  138.                          {
  139.                                 stop_flag = 1;//上升或者下降中間位置停
  140.                         }
  141.                         else
  142.                         {
  143.                                 stop_flag = 2;// 到最底下停止
  144.                         }
  145.          }
  146.          else
  147.          {
  148.                  UART0->INTSTS &= ~UART_INTSTS_RDAIF_Msk;
  149.          }
  150. }
  151. void SYS_Init(void)
  152. {
  153.           //使用內部的RC時鐘振蕩器
  154.           CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
  155.                 //超時接收等待內部時鐘穩定
  156.                 CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
  157.                 //設置HIRC為HCLK的時鐘源并且HCLK沒有分頻HIRC
  158.                 CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
  159.        
  160.     /*使能外部高速晶振*/
  161.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
  162.     /*等待12MHz穩定*/
  163.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
  164.     /*切換HCLK的時鐘源為外部晶振*/
  165.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT, CLK_CLKDIV0_HCLK(1));
  166.                 //設置HCLK的頻率,PLL 144MHz 但是HCLK得時鐘源是PLL并且2分頻
  167.                 CLK_SetCoreClock(PLL_CLOCK);
  168.                
  169.                 SystemCoreClockUpdate();
  170.                
  171.     /*選擇UART時鐘源HXT*/
  172.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));
  173.                 /*使能UART的時鐘*/
  174.     CLK_EnableModuleClock(UART0_MODULE);
  175.                
  176.     /*PD0是UART_RXD PD1是UART_TXD*//*引腳復用*/
  177.     SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD1MFP_Msk | SYS_GPD_MFPL_PD0MFP_Msk);
  178.     SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD1MFP_UART0_TXD | SYS_GPD_MFPL_PD0MFP_UART0_RXD);
  179. }
  180. void UART0_Init(void)
  181. {
  182.     SYS_ResetModule(UART0_RST);
  183.     UART_Open(UART0, 115200);
  184.                 //使能了RDA中斷,THRE中斷和RXTO中斷
  185.                 UART_EnableInt(UART0,(UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk));
  186. }
  187. void GPIO_Init(void)
  188. {
  189.           GPIO_SetMode(PE, BIT0, GPIO_MODE_OUTPUT);
  190.                 PE0 = 1;//綠燈滅
  191.                 GPIO_SetMode(PF, BIT2, GPIO_MODE_OUTPUT);
  192.                 PF2 = 1;//藍燈滅
  193.                 GPIO_SetMode(PD, BIT7, GPIO_MODE_OUTPUT);/*控制蜂鳴器輸出,低滅高響*/
  194.                 BEEP_Onetime();//有源蜂鳴器
  195.                 /***********************************輸出步進電機*********************************/
  196.                 GPIO_SetMode(PA, BIT0, GPIO_MODE_OUTPUT);//MOTOR1_A-
  197.                 GPIO_SetMode(PA, BIT1, GPIO_MODE_OUTPUT);//MOTOR1_DIR-
  198.                 GPIO_SetMode(PA, BIT2, GPIO_MODE_OUTPUT);//MOTOR2_A-
  199.                 GPIO_SetMode(PA, BIT3, GPIO_MODE_OUTPUT);//MOTOR2_DIR-
  200.                 /************************************輸入開關***********************************/
  201.                 GPIO_SetMode(PD, BIT2, GPIO_MODE_INPUT);
  202.     GPIO_SetMode(PD, BIT3, GPIO_MODE_INPUT);
  203.                 GPIO_SetMode(PC, BIT3, GPIO_MODE_INPUT);
  204.                 GPIO_SetMode(PC, BIT4, GPIO_MODE_INPUT);
  205.                 /**********************輸入傳感器***********************************************/
  206.                 GPIO_SetMode(PB, BIT0, GPIO_MODE_INPUT);
  207.                 GPIO_SetMode(PB, BIT1, GPIO_MODE_INPUT);
  208.                 GPIO_SetMode(PB, BIT2, GPIO_MODE_INPUT);
  209.                 GPIO_SetMode(PB, BIT3, GPIO_MODE_INPUT);
  210.                 GPIO_SetMode(PB, BIT4, GPIO_MODE_INPUT);
  211.                 GPIO_SetMode(PB, BIT5, GPIO_MODE_INPUT);
  212.                 GPIO_SetMode(PB, BIT6, GPIO_MODE_INPUT);
  213.                 GPIO_SetMode(PC, BIT0, GPIO_MODE_INPUT);
  214.                 GPIO_SetMode(PC, BIT1, GPIO_MODE_INPUT);
  215.                 GPIO_SetMode(PC, BIT2, GPIO_MODE_INPUT);
  216.                 /**********************配置中斷*********************************************/
  217.                 GPIO_EnableInt(PB,0, GPIO_INT_FALLING);//傳感器1 J8
  218.                 GPIO_EnableInt(PB,1, GPIO_INT_FALLING);//傳感器1 J9
  219.                 GPIO_EnableInt(PB,2, GPIO_INT_FALLING);//傳感器2 J10
  220.                 GPIO_EnableInt(PB,3, GPIO_INT_FALLING);//傳感器3 J11
  221.                 GPIO_EnableInt(PB,4, GPIO_INT_FALLING);//傳感器4 J12
  222.                 GPIO_EnableInt(PB,5, GPIO_INT_FALLING);//傳感器4 J13
  223.                 GPIO_EnableInt(PB,6, GPIO_INT_FALLING);//傳感器4 J14
  224.                
  225.                 GPIO_EnableInt(PC,4, GPIO_INT_FALLING);//開關J4
  226.                 NVIC_EnableIRQ(GPC_IRQn);
  227.                
  228.     GPIO_SET_DEBOUNCE_TIME(GPIO_DBCTL_DBCLKSRC_LIRC, GPIO_DBCTL_DBCLKSEL_1024);
  229.     GPIO_ENABLE_DEBOUNCE(PB,BIT1|BIT2|BIT3|BIT4);//去抖動
  230.                 GPIO_ENABLE_DEBOUNCE(PC,BIT4);//去抖動
  231. }

  232. int32_t main(void)
  233. {
  234.                 volatile uint32_t clock_fre = 0;
  235. ……………………

  236. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
M452LG6AE_Gate.rar (2.89 MB, 下載次數: 36)
回復

使用道具 舉報

ID:241514 發表于 2018-2-26 22:43 | 顯示全部樓層
謝謝分享感謝
回復

使用道具 舉報

ID:252765 發表于 2018-12-15 14:29 | 顯示全部樓層

謝謝分享感謝
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品乱码久久久久久黑人 | аⅴ资源新版在线天堂 | 国产综合久久 | 免费一二区| 久久一起草 | 欧美日韩一区在线播放 | 在线看黄免费 | 久久不射网 | 亚洲一区免费 | 日本超碰在线 | 精品国产伦一区二区三区观看方式 | 成人不卡视频 | 久久九九色 | 国产午夜精品一区二区三区嫩草 | 天天干com| 亚洲精视频 | 在线观看亚洲专区 | 中文字幕 国产 | 日日想夜夜操 | 超碰在线播 | 国精产品一区一区三区免费完 | av黄色在线 | 国产激情视频在线 | 影音先锋亚洲资源 | 亚洲精品一区二三区不卡 | 97久久久久久久久 | 天天草天天干天天 | 国产日韩精品视频 | 国产一级片av | 美女逼网站 | 欧美日韩国产精品激情在线播放 | 成人av一区二区三区 | 午夜三级在线观看 | 精品视频一区二区三区在线观看 | 精品亚洲一区二区三区 | 亚洲 中文 欧美 日韩 在线观看 | 久久一久久 | 免费在线观看91 | 国产精品久久九九 | 爱爱无遮挡| 精久久 |