/********************************************************************/
/* 程序名称:motor.c */
/* 程序描述:由波形发生器输入方波,用频率控制电机转速,用占空比控制电机正反转 */
/* 程序编写: */
/*编程日期:20120107 */
/* 程序版本:第1版 */ /********************************************************************/
#include "DSP28_Device.h"//头文件
#define X GpioDataRegs.GPADAT.bit.GPIOA7//直流电机X端
#define Y GpioDataRegs.GPADAT.bit.GPIOA6//直流电机Y端
#define uchar unsigned char
#define uint unsigned int
//全局变量
uint temp; //波形周期
uint temp1; //波形高电平波长
uint Period=70; //控制延时周期
//函数声明
interrupt void CAPINT1_ISR(void);//CAP1中断函数
interrupt void CAPINT2_ISR(void);//CAP2中断函数
void Init_IO(void); //初始化IO口
void Motor_Drive(void); //电机驱动
void Delay_500uS(void); //延时函数(0.5mS)
/****************************************************************/
/* 形式参数: */
/* 返回值:void */
/* 函数描述:主函数 */
/****************************************************************/
void main()
{
InitSysCtrl(); //初始化系统
DINT; //关中断
IER = 0; //中断使能寄存器清0
IFR = 0; //中断标志寄存器清0
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE向量表
EALLOW;
PieVectTable.CAPINT1 = &CAPINT1_ISR;//将中断向量表中的CAPINT1指向CAP1中断函数
PieVectTable.CAPINT2 = &CAPINT2_ISR;//将中断向量表中的CAPINT2指向CAP2中断函数
EDIS;
Init_IO(); //初始化IO口
Init_Ev(); //初始化Ev
EINT; //开中断
ERTM; //使能调试事件
for(;;)
{
KickDog();
Motor_Drive(); //驱动电机
}
}
/****************************************************************/
/* 形式参数:void */
/* 返回值:void */
/* 函数描述:CAP1中断函数 */
/****************************************************************/
interrupt void CAPINT1_ISR(void)
{
DINT;
temp=EvaRegs.CAP1FBOT - EvaRegs.CAP1FIFO;
EvaRegs.EVAIFRC.bit.CAP1INT = 1; //外设级中断标志清零
PieCtrl.PIEACK.bit.ACK3 = 1; //应答清零
EINT;
GpioDataRegs.GPATOGGLE.bit.GPIOA0 = 1;//GPIOA0电平翻转(用于测试中断是否正常)
}
/****************************************************************/
/* 形式参数:void */
/* 返回值:void */
/* 函数描述:CAP2中断函数 */
/****************************************************************/
interrupt void CAPINT2_ISR(void)
{
DINT;
temp1=EvaRegs.CAP2FBOT - EvaRegs.CAP2FIFO;
EvaRegs.EVAIFRC.bit.CAP2INT = 1; //外设级中断标志清零
PieCtrl.PIEACK.bit.ACK3 = 1; //应答清零
EINT;
GpioDataRegs.GPATOGGLE.bit.GPIOA1 = 1;//GPIOA1电平翻转(用于测试中断是否正常)
}
/****************************************************************/
/* 形式参数:void */
/* 返回值:void */
/* 函数描述:初始化GPIO */
/****************************************************************/
void Init_IO(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0; //PA口功能配置清0
GpioMuxRegs.GPAMUX.bit.CAP1Q1_GPIOA8 = 1; //设置PA8引脚为CAP1功能
GpioMuxRegs.GPAMUX.bit.CAP2Q2_GPIOA9 = 1; //设置PA9引脚为CAP2功能
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 0; //打开GPIOA0
GpioMuxRegs.GPADIR.bit.GPIOA0 = 1; //设置GPIOA0为输出
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1 = 0; //打开GPIOA1
GpioMuxRegs.GPADIR.bit.GPIOA1 = 1; //设置GPIOA1为输出
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6 = 0; //打开GPIOA6
GpioMuxRegs.GPADIR.bit.GPIOA6 = 1; //设置GPIOA6为输出
GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7 = 0; //打开GPIOA7
GpioMuxRegs.GPADIR.bit.GPIOA7 = 1; //设置GPIOA7为输出
EDIS;
GpioDataRegs.GPADAT.bit.GPIOA0 = 0; //设置GPIOA0初值为0
GpioDataRegs.GPADAT.bit.GPIOA6 = 0; //设置GPIOA6初值为0
GpioDataRegs.GPADAT.bit.GPIOA7 = 0; //设置GPIOA7初值为0
}
/***************************************************************/
/* 形式参数:void */
/* 返回值:void */
/* 函数描述:延时函数 0.5ms */
/***************************************************************/
void Delay_500uS(void)
{
CpuTimer0Regs.TCR.bit.TRB = 1; //定时器重装
CpuTimer0Regs.TCR.bit.TSS = 0; //启动定时器
while(CpuTimer0Regs.TCR.bit.TIF != 1); //计数完成
CpuTimer0Regs.TCR.bit.TSS = 1; //停止定时器
}
/***************************************************************/
/* 形式参数:void */
/* 返回值:void */
/* 函数描述:电机驱动程序 */
/***************************************************************/
void Motor_Drive(void)
{
uchar i;
if(temp1*2 >= temp) //正转
{
X = 0; //直流电机X端低电平
Y = 1; //直流电机Y端高电平
for(i = 1;i
Delay_500uS();
Y = 0; //直流电机X端低电平
for(i = 1;i
Delay_500uS();
}
else //反转
{
X = 1; //直流电机X端高电平
Y = 0; //直流电机Y端低电平
for(i = 1;i
Delay_500uS();
Y = 1; //直流电机X端高电平
for(i = 1;i
Delay_500uS();
}
}
/***************************************************************/
// No more.
/***************************************************************/
13510179723_912348475 2012-2-14 17:47
DSP系统设计课的课程设计,包括PPT、实验程序和实验报告。上学期最后几个通宵就是在干这个。
用户235330 2009-9-21 16:39