找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8803|回复: 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, 下载次数: 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 单片机教程网

快速回复 返回顶部 返回列表