📄 main.c
字号:
/****************************************Copyright (c)**************************************************
********************************************************************************************************/
#include "config.h"
#define DIR 1 << 2 // P0.2控制电机方向
#define PULSE 1 << 5 // P0.5控制电机脉冲
volatile uint16 u16MStepCount = 0;
volatile uint16 u16CoderCount = 0;
/*
*********************************************************************************************************
** 函数名称 :IRQ_Timer0()
** 函数功能 :定时器0中断服务程序。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq IRQ_Timer0(void)
{
if ((IO0SET & PULSE) == 0)
IO0SET = PULSE; //电机脉冲为高电平
else
IO0CLR = PULSE; //电机脉冲为低电平
u16MStepCount++;
if(u16MStepCount >= 1000)
{
T0TCR = 0; // 关闭定时器0
IO0SET = PULSE; // 电机脉冲为高电平
}
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
/*
*********************************************************************************************************
** 函数名称 :Timer1_CapInt()
** 函数功能 :定时器1捕获中断服务程序 计数
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void __irq Timer1_CapInt(void)
{
T1IR = 1 << 6; // 清除CAP1.2中断标志
u16CoderCount = T1TC; // 读取编码器计数值
VICVectAddr = 0x00; // 向量中断处理结束
}
//*******************************************************************************************************//
//** 函数名称 SetMotor(uint8 dir, uint16 Freq,uint16 setstep)*******//
//** 函数功能 :设置步进电机并启动电机*******//
//** 入口参数 :电机转向:0-1;电机速度:脉冲频率0-1000Hz,电机转动脉冲数:0连续转动*******//
//** 出口参数 :无*******//
//*******************************************************************************************************//
void SetMotor(uint8 dir, uint16 Freq)
{
if(Freq > 1000) Freq = 1000;
if(dir == 1)
IO0SET = DIR; // P0.2控制方向,输出高电平 顺时针转动
else
IO0CLR = DIR; // P0.2控制方向,输出低电平 逆时针转动
T0MR0 = Fpclk / (Freq<<1); // 输出脉冲频率控制
T0TCR = 0x01; // 启动定时器0 电机开始运动
}
/**********************************************************************************************************
** 函数名称 :main()
** 函数功能 :
** 调试说明 :
**********************************************************************************************************/
int main (void)
{
PINSEL0 = 0x00000000; // 设置引脚连接GPIO
PINSEL1 = 1 << 2; // P0.17连接捕获1.2
IO0DIR = DIR|PULSE; // 设置P0.2和P0.5控制口输出
IRQEnable(); // 使能IRQ中断
/* 设置中断 */
VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断
VICVectCntl0 = 0x20 | 4; // Timer0分配到IRQ slot0,即最高优先级
VICVectAddr0 = (uint32)IRQ_Timer0; // 设置Timer0向量地址
VICVectCntl1 = 0x20 | 5; // Timer1分配到IRQ slot1,即次高优先级
VICVectAddr1 = (uint32)Timer1_CapInt; // 设置Timer1向量地址
VICIntEnable = (1 << 4)|(1 << 5); // 使能Timer0/Timer1中断
T0TC = 0; // 定时器设置为0
T0PR = 0; // 时钟不分频
T0MCR = 0x03; // 设置T0MR0匹配后复位T0TC 并产生中断
T1TC = 0;
T1CCR = (1 << 7) | (1 << 8); // 设置CAP1.2下降沿捕获 允许产生中断
T1CTCR = (0x02 << 0) | // 计数器,在CAP的下降沿递增
(0x02 << 2); // 选择CAP1.2
T1TCR = 0x01; // 启动计数器1
SetMotor(1, 650);
while(1);
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -