📄 main.c
字号:
}
if (GmRight.iSpeed < 0) { /* 设置速度下限 */
GmRight.iSpeed = 0;
}
TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[GmRight.iSpeed]); /* 设置定时时间 */
}
/*********************************************************************************************************
** Function name: Timer0A_ISR
** Descriptions: Timer0中断服务函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Timer0A_ISR (void)
{
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /* 清除定时器0中断。 */
switch (GmRight.cState) {
case STOP: /* 停止,同时清零脉冲值 */
GmRight.uiPulse = 0;
GmRight.uiPulseCtr = 0;
GmRight.iSpeed = 0;
break;
case RUN: /* 电机运行 */
rightMotorContr(); /* 电机驱动程序 */
speedContrR();
break;
default:
break;
}
/*
* 是否完成任务判断
*/
if (GmRight.cState == RUN) {
GmRight.uiPulseCtr++; /* 运行脉冲计数 */
if (GmRight.uiPulseCtr >= GmRight.uiPulse) {
GmRight.cState = STOP;
GmRight.uiPulseCtr = 0;
GmRight.uiPulse = 0;
GmRight.iSpeed = 0;
}
}
}
/*********************************************************************************************************
** Function name: SysTick_ISR
** Descriptions: 定时中断扫描。
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void SysTick_ISR (void)
{
static int32 iR = 0;
/*
* 如果右电机长时间停止,则断电
*/
if (GmRight.cState == STOP) {
iR++;
} else {
iR = 0;
}
if (iR >= 300) {
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
0x00);
}
}
/*********************************************************************************************************
** Function name: keyCheck
** Descriptions: 读取按键
** input parameters: 无
** output parameters: 无
** Returned value: true: 按键已按下
** false: 按键未按下
*********************************************************************************************************/
uint8 keyCheck (void)
{
if (GPIOPinRead(GPIO_PORTC_BASE, KEY) == 0) {
delay(50);
while(GPIOPinRead(GPIO_PORTC_BASE, KEY) == 0);
return(true);
}else {
return(false);
}
}
/*********************************************************************************************************
** Function name: stepMotorIint
** Descriptions: 步进电机控制初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void stepMotorIint (void)
{
uint16 n = 0;
/*
* 设置驱动步进电机的八个I/O口为输出模式
*/
GPIODirModeSet(GPIO_PORTD_BASE,
PHRA1 |
PHRA2 |
PHRB1 |
PHRB2,
GPIO_DIR_MODE_OUT);
/*
* 对左右电机转动的位置初始化
*/
GPIOPinWrite(GPIO_PORTD_BASE,
PHRA1 | PHRA2 | PHRB1 | PHRB2,
PHRA1 | PHRA2 | PHRB1 | PHRB2);
/*
* 初始化加速/减速时定时器加载值的数据表
*/
GuiAccelTable[0] = 2236068;
GuiAccelTable[1] = 926179;
for(n = 2; n < 300; n++) {
GuiAccelTable[n] = GuiAccelTable[n - 1] - (2 * GuiAccelTable[n - 1] / (4 * n + 1));
}
/*
* 初始化定时器0,用来控制右电机的转速
*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); /* 使能定时器0模块 */
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); /* 配置为32位周期计数模式 */
TimerLoadSet(TIMER0_BASE, TIMER_A, GuiAccelTable[0]); /* 设置定时时间 */
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /* 设置为溢出中断 */
IntEnable(INT_TIMER0A); /* 使能定时器0中断 */
TimerEnable(TIMER0_BASE, TIMER_A); /* 使能定时器0 */
}
/*********************************************************************************************************
** Function name: keyInit
** Descriptions: 对连接按键的GPIO口初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void keyInit (void)
{
GPIODirModeSet(GPIO_PORTC_BASE, KEY, GPIO_DIR_MODE_IN); /* 设置按键口为输入 */
}
/*********************************************************************************************************
** Function name: sysTickInit
** Descriptions: 系统节拍定时器初始化。
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void sysTickInit (void)
{
SysTickPeriodSet(SysCtlClockGet() / 1000); /* 设置定时时钟为1ms */
SysTickEnable(); /* 使能系统时钟 */
SysTickIntEnable(); /* 使能系统时钟中断 */
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 主函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
main (void)
{
SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ ); /* 使能PLL,50M */
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOC ); /* 使能GPIO C口外设 */
SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOD ); /* 使能GPIO D口外设 */
keyInit(); /* 按键初始化 */
sysTickInit(); /* 系统时钟初始化 */
stepMotorIint(); /* 传感器初始化 */
while(1){
if (keyCheck() == true) { /* 查询判断是否有按键按下 */
GmRight.uiPulse = 2000; /* 设定步进电机转动2000步 */
GmRight.cDir = GOAHEAD; /* 设定步进电机向前转动 */
GmRight.cState = RUN; /* 启动步进电机转动 */
}
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -