基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx
- 文档编号:18470883
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:15
- 大小:18.24KB
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx
《基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx》由会员分享,可在线阅读,更多相关《基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx(15页珍藏版)》请在冰点文库上搜索。
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序
DSP2407控制直流电机程序
附录
系统主程序:
/*Main.c*/
/*PWM电机控制程序,正反转,默认设置的工作频率1kHz*/
#include"register.h"
voidSystemInit();
voidTimer1Init();
voidKickDog();
voidchange();
voidcap4Init();
unsignedintnumled=20,numkey=0;
unsignedinta=0,b=0;
unsignedintcount=0,time_count=0,f_count=0;
unsignedchartab1[3]={'r','/','s'};
unsignedchartab2[15]={'','S','e','t','','B','y','','L,'i','n','F','a','n','g'};
#defineRS_HPADATDIR=PADATDIR|0x0008
#defineRS_LPADATDIR=PADATDIR&0xFFF7
#defineRW_HPADATDIR=PADATDIR|0x0010
#defineRW_LPADATDIR=PADATDIR&0xFFEF
#defineE_HPADATDIR=PADATDIR|0x0020
#defineE_LPADATDIR=PADATDIR&0xFFDF
#definePASCPADATDIR=PADATDIR|0x3800
#definePCSCPCDATDIR=PCDATDIR|0xFF00
#definePCSRPCDATDIR=PCDATDIR&0x00FF
#defineucharunsignedchar
#defineuintunsignedint
voidLCD1602init();
voidwritecommand(ucharcommand);
voidLCDdisplay();
voidreadstat();
voiddelay(unsignedinti);
main()
{
SystemInit();//系统初始化
MCRB=MCRB&0xFF00;//IOPC口为一般I/O口
MCRA=MCRA&0xC0C7;//IOPB0-5、IOPA3-5设为IO口模式
MCRC=MCRC&0xE0FF;//IOPF0-4设为IO口模式
PBDATDIR=0xFFC2;//所有LED=0
PFDATDIR=0xF8E7;//置IOPE1-3为输入口
Timer1Init();//定时器1初始化
cap4Init();
LCD1602init();
T3CON=T3CON|0X0040;//启动定时器3
asm("CLRCINTM");
while
(1)
{
change();
LCDdisplay();
}
}
voidSystemInit()
{
asm("SETCINTM");/*关闭总中断*/
asm("CLRCSXM");/*禁止符号位扩展*/
asm("CLRCCNF");
asm("CLRCOVM");/*累加器结果正常溢出*/
SCSR1=0x83FE;/*系统时钟CLKOUT=20*2=40M*/
/*打开ADC,EVA,EVB,CAN和SCI的时钟,系统时钟CLKOUT=40M*/
WDCR=0x006F;/*禁止看门狗,看门狗时钟64分频*/
KickDog();/*初始化看门狗*/
IFR=0xFFFF;/*清除中断标志*/
IMR=0x0000;/*禁止所有中断*/
}
voidTimer1Init()
{
EVAIMRA=0x0080;//定时器1周期中断使能
EVAIFRA=0xFFFF;//清除中断标志
GPTCONA=0x0000;
T1PR=25000;//定时器1初值,定时0.4us*2500=1ms
CMPR1=25000;
T1CNT=0;
T1CON=0x144E;//增模式,TPS系数40M/16=2.5M,T1使能
IMR|=0x0002;//打开中断2
}
voidcap4Init()
{
T3PR=0xFFFF;//通用定时器3的周期寄存器为0XFFFF
T3CON=0x1400;//通用定时器3为连续增计数模式
T3CNT=0x00;//计数器清0
WSGR=0x0000;//禁止所有等待状态
CAPCONB=0x0A440;//设置捕获单元4为检测上升沿,且选择TIMER3为时钟
asm("clrcINTM");//开总中断
IMR|=0x0008;//允许中断优先级4的中断
CAP4FIFO=0;
EVBIMRC=EVBIMRC|0X0001;//允许CAPTURE4中断
EVBIFRC=EVBIFRC|0X0FFFF;
}
voidLCD1602init()//LCD1602初始化函数
{
writecommand(0x38);
writecommand(0x38);
writecommand(0x38);
delay(150);
writecommand(0x01);
delay(150);
writecommand(0x02);
delay(150);
writecommand(0x06);
delay(150);
writecommand(0x0c);
delay(150);
writecommand(0x38);
}
voidwritecommand(ucharcommand)//LCD1602写命令函数
{
readstat();
PCSC;
PASC;
RS_L;
RW_L;
PCDATDIR=PCDATDIR&0x0FF00|command;
//在此条指令之后只要使能信号有个由高到低的跳变即可写液晶
delay(5);
E_L;//可以不要
asm("NOP");//可以不要
asm("NOP");//可以不要
asm("NOP");//可以不要
E_H;
delay(5);//可以不要
E_L;
}
voidreadstat()
{
unsignedintstat;
PCSR;
PASC;
while
(1)
{
RS_L;
E_H;
RW_H;
stat=PCDATDIR&0x0080;
if(stat==0)break;
}
}
voidwritedata(uchardata)//LCD1602写数据函数
{
readstat();
PCSC;
PASC;
RS_H;
RW_L;
PCDATDIR=PCDATDIR&0x0FF00|data;
//在此条指令之后只要使能信号有个由高到低的跳变即可写液晶
//如果在这之前就有
//由高到低的变化就会送出去乱码,即不是自己想要的值
delay(5);
E_L;//可以不要
asm("NOP");//可以不要
asm("NOP");//可以不要
asm("NOP");//可以不要
E_H;
delay(5);//可以不要
E_L;
}
voidchange()
{
MCRA=MCRA|0x00C0;//PA6为PWM口
ACTRA=0x0006;//PWM1高有效
DBTCONA=0x0530;//使能死区定时器1,分频40M/16=2.5M,死区时5*0.4us=2us
COMCONA=0xA600;//比较控制寄存器
if((PFDATDIR&0x0001)!
=0x0001)//若有按键仍为低,IOPF0=0
{
delay(800);
if((PFDATDIR&0x0001)!
=0x0001)
{
b=0;
numkey=1;
a++;
if(a==4)a=1;
while((PFDATDIR&0x0001)!
=0x0001);
}
}
if((PFDATDIR&0x0002)!
=0x0002)//若有按键仍为低,IOPF1=0
{
a=0;
b=0;
numkey=2;
}
if((PFDATDIR&0x0004)!
=0x0004)//若有按键仍为低,IOPF2=0
{
delay(800);
if((PFDATDIR&0x0004)!
=0x0004)
{
a=0;
numkey=3;
b++;
if(b==4)b=1;
while((PFDATDIR&0x0004)!
=0x0004);
}
}
if(numkey==1)
{
PFDATDIR=PFDATDIR&0xF8E7;
PFDATDIR=PFDATDIR|0x1010;
PBDATDIR=PBDATDIR&0xFFC7;//将其他的led灭掉
PBDATDIR=PBDATDIR|0x0404;//IOPB2=1;LED1亮
if(a==1)CMPR1=21000;
if(a==2)CMPR1=17000;
if(a==3)CMPR1=23500;
}
if(numkey==2)
{
PFDATDIR=PFDATDIR&0xF8E7;
CMPR1=25000;
PFDATDIR=PFDATDIR|0x1818;
PBDATDIR=PBDATDIR&0xFFCB;
PBDATDIR=PBDATDIR|0x0808;//IOPB3=1;LED2亮
}
if(numkey==3)
{
PFDATDIR=PFDATDIR&0xF8E7;
PFDATDIR=PFDATDIR|0x0808;
PBDATDIR=PBDATDIR&0xFFD3;
PBDATDIR=PBDATDIR|0x1010;//IOPB4=1;LED3亮
if(b==1)CMPR1=21000;
if(b==2)CMPR1=17000;
if(b==3)CMPR1=23500;
}
}
voidc_int2()/*定时器1中断服务程序*/
{
if(PIVR!
=0x27)
{asm("CLRCINTM");
return;
}
time_count++;
if(time_count>=100)
{
time_count=0;
f_count=count;
count=0;
}
T1CNT=0;
numled--;
if(numled==0)
{
numled=20;
if((PBDATDIR&0x0001)==0x0001)
PBDATDIR=PBDATDIR&0xFFFE;//IOPB0=0;LED灭
else
PBDATDIR=PBDATDIR|0x0101;//IOPB0=1;LED亮
}
EVAIFRA=0x80;
asm("CLRCINTM");
return;
}
voidcap4int()
{
intflag;
flag=EVBIFRC&0X01;//判断是否是CAP4中断
if(flag!
=0x01)
{
asm("clrcINTM");//返回前开中断
return;//如果不是CAP4中断,则直接返回
}
count++;
EVBIFRC=EVBIFRC|0x01;//写"1"清除CAP4中断标志
asm("clrcINTM");//返回前开中断
return;//中断返回
}
voidLCDdisplay(void)
{
uintdata;
uchardata_qian,data_bai,data_shi,data_ge,address=0,add=0;
writecommand(0x84);
if(numkey==3)
{
data='-';
}
else
{
data='+';
}
writedata((uchar)data);
data=f_count/4;
data_qian=data/1000;
data_bai=data%1000/100;
data_shi=data%100/10;
data_ge=data%10;
writecommand(0x85);
writedata(data_qian+0x30);
writecommand(0x86);
writedata(data_bai+0x30);
writecommand(0x87);
writedata(data_shi+0x30);
writecommand(0x88);
writedata(data_ge+0x30);
address=0x89;
for(add=0;add<3;add++,address++)
{
writecommand(address);
data=tab1[add];
writedata(data);
}
address=0xC0;
for(add=0;add<15;add++,address++)
{
writecommand(address);
data=tab2[add];
writedata(data);
}
}
voiddelay(unsignedinti)
{unsignedintj;
for(;i>0;i--)
for(j=1000;j>0;j--);
}
voidinterruptPHANTOM()
{
asm("clrcINTM");//返回前开中断
return;
}
voidKickDog()/*踢除看门狗*/
{
WDKEY=0x5555;
WDKEY=0xAAAA;
}
中断向量表:
;define.asm
.include"lf2407a.h"
.include"F2407REGS.H"
.global_c_int0,_c_int2,_cap4int
.global_IMR,_IFR
.global_SCSR1,_SCSR2,_XINT1CR,_XINT2CR
.global_WDCNTR,_WDKEY,_WDCR
.global_MCRA,_MCRB,_MCRC,_PADATDIR,_PBDATDIR,_PCDATDIR,_PEDATDIR,_PFDATDIR
.global_ADCTRL1,_ADCTRL2,_MAXCONV,_CHSELSEQ1,_CHSELSEQ2,_CHSELSEQ3,_CHSELSEQ4
.global_AUTO_SEQ_SR,_RESULT0,_RESULT1,_RESULT2,_RESULT8,_RESULT9
.global_CANMDER,_CANTCR,_CANRCR,_CANMCR,_CANBCR2,_CANBCR1,_CANESR,_CANGSR
.global_CANCEC,_CANIFR,_CANIMR,_CANLAM0H,_CANLAM0L
.global_CANID0L,_CANID0H,_CANCTRL0,_CANBX0A,_CANBX0B,_CANBX0C,_CANBX0D
.global_CANID1L,_CANID1H,_CANCTRL1,_CANBX1A,_CANBX1B,_CANBX1C,_CANBX1D
.global_CANID2L,_CANID2H,_CANCTRL2,_CANBX2A,_CANBX2B,_CANBX2C,_CANBX2D
.global_CANID3L,_CANID3H,_CANCTRL3,_CANBX3A,_CANBX3B,_CANBX3C,_CANBX3D
.global_CANID4L,_CANID4H,_CANCTRL4,_CANBX4A,_CANBX4B,_CANBX4C,_CANBX4D
.global_CANID5L,_CANID5H,_CANCTRL5,_CANBX5A,_CANBX5B,_CANBX5C,_CANBX5D
.global_SCICCR,_SCICTL1,_SCIHBAUD,_SCILBAUD,_SCICTL2,_SCIRXST,_SCIRXEMU,_SCIRXBUF,
_SCITXBUF,_SCIPRI;
.global_GPTCONA,_T1CNT,_T1PR,_T1CON,_T2CNT,_T2PR,_T2CON
.global_EVAIMRA,_EVAIMRB,_EVAIFRA,_EVAIFRB,_PIVR
.global_GPTCONB,_T3CNT,_T3CMPR,_T3PR,_T3CON,_COMCONA,_ACTRA,_DBTCONA,_CMPR1,
_EVBIMRA,_EVBIFRA
.global_WSGR,_CAPCONB,_EVBIMRC,_EVBIFRC
;建立中断向量表
.sect".vectors"
RSVECTB_c_int0
INT1BPHANTOM
INT2B_c_int2
INT3BPHANTOM
INT4B_cap4int
INT5BPHANTOM
INT6BPHANTOM
.text
PHANTOM:
KICK_DOG
RET
.end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DSP 直流电机 控制系统 程序 包括 1602 显示 捕获 CAPPWM 发生