单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:9321|回复:2

新唐M452LG6AE单片机实现电机控制 原理图和PCB程序

[复制链接]
ID:189392发表于 2017-6-22 14:42|显示全部楼层
使用新唐M452LG6AE单片机实现电机控制,用到的资源有,串口,GPIO,定时器。原理图和PCB还有源代码如附件所示
0.png0.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, 下载次数: 35)
ID:241514发表于 2018-2-26 22:43|显示全部楼层
谢谢分享感谢
ID:252765发表于 2018-12-15 14:29|显示全部楼层

谢谢分享感谢

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网