标题:
新唐M452LG6AE单片机实现电机控制 原理图和PCB程序
[打印本页]
作者:
zhaoshuxin_wc
时间:
2017-6-22 14:42
标题:
新唐M452LG6AE单片机实现电机控制 原理图和PCB程序
使用新唐M452LG6AE单片机实现电机控制,用到的资源有,串口,GPIO,定时器。原理图和PCB还有源代码如附件所示
0.png
(43.16 KB, 下载次数: 226)
下载附件
2017-6-22 19:05 上传
0.png
(42.81 KB, 下载次数: 226)
下载附件
2017-6-22 19:06 上传
单片机源程序如下:
#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 上传
点击文件名下载附件
下载积分: 黑币 -5
原理图PCB.rar
(304.67 KB, 下载次数: 31)
2017-6-22 14:42 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
1058939249
时间:
2018-2-26 22:43
谢谢分享感谢
作者:
cement777
时间:
2018-12-15 14:29
谢谢分享感谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1