基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx

上传人:b****0 文档编号:18470883 上传时间:2023-08-18 格式:DOCX 页数:15 大小:18.24KB
下载 相关 举报
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第1页
第1页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第2页
第2页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第3页
第3页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第4页
第4页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第5页
第5页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第6页
第6页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第7页
第7页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第8页
第8页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第9页
第9页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第10页
第10页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第11页
第11页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第12页
第12页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第13页
第13页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第14页
第14页 / 共15页
基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx

《基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx》由会员分享,可在线阅读,更多相关《基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx(15页珍藏版)》请在冰点文库上搜索。

基于DSP的直流电机控制系统C程序包括1602显示捕获CAPPWM波发生程序.docx

基于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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2