原创 基于SEED-DTK 2812实验箱的直流电机控制实验

2012-2-14 17:45 1565 11 12 分类: 处理器与DSP

/********************************************************************/

/*  程序名称: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.

/***************************************************************/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

tam

文章评论1条评论)

登录后参与讨论

13510179723_912348475 2012-2-14 17:47

DSP系统设计课的课程设计,包括PPT、实验程序和实验报告。上学期最后几个通宵就是在干这个。

用户235330 2009-9-21 16:39

IC渠道网,www.17ic.com 为广大的供应商和采购商提供最真切的服务123
相关推荐阅读
13510179723_912348475 2018-04-15 22:40
BOOST-DRV8711测试
20180415 BOOST-DRV8711买了不知道几年了,一直想测试一下TI步进电机细分芯片256细分的神奇,一直没能抽出时间。感觉当年先进的技术都快被淘汰了,我还没测试过,是一个梗。今...
13510179723_912348475 2015-05-10 12:06
怀念
偶尔又遇到自己的博文。好怀念!工作后没有以前那么悠哉,没有那么多时间写博客。前几天刚刚度过工作周年纪念日,过去的一年瞎扯蛋,到现在,似乎又回到搞硬件的“正道”上来了!...
13510179723_912348475 2014-08-18 21:49
3个月的玩儿失踪
        不知不觉失踪了3个月,不明真相的还以为我被自己的上一篇博文打击了,或者殉情了,其实我是被工作压抑了。         工作后没有当学生那种闲心情,即使有也写不出任何东西。灵感全...
13510179723_912348475 2014-05-19 21:41
失去的痛楚
         我不知道自己究竟喜不喜欢她,她并不漂亮,性格大大咧咧。但是有一点我是知道的,我对她有那么一点感觉。所以,我很想告诉她我的感受,但也犹豫不决。          她告诉我她要离...
13510179723_912348475 2014-05-13 22:47
我变了,也会变
        为了适应社会,我给自己留了一个忠言:吃任何小亏。         有人说过,人20岁不冲动不会成功,30谁还冲动也不会成功。我28岁,慢慢成熟下来,看来是早熟了。     ...
13510179723_912348475 2014-05-09 22:46
上了一周班
        悲催了,开始上班。          不知不觉干了一周。因为还是实习,在公司瞎奋,没有压力。第一天部门老大出差了,我被安排在生产一线参观;第二天请了假去富士康面试,实质上就是去...
我要评论
1
11
关闭 站长推荐上一条 /2 下一条