DSP经典源程序程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSP经典源程序程序
#include\#include\
/***************************************************/interruptvoidt1pint_isr(v oid);interruptvoidt2pint_isr(void);interruptvoidcap_isr(void);
interruptvoidpdpinta_isr(void);voiddelay(unsignedintm);
unsignedintt1prd=117;//定时器1的周期unsignedintt2prd=117;//定时器2的标志
unsignedintdir=0;//电机旋转方向unsignedintpwm=20;
unsignedintdccurent,u,v,w,speedad;//直流母线电流unsignedintdcvoltage;//直流母线电压uint32sumdcv=0;
unsignedintdcvcount=0,averagedcv=0;//母线电压平均值初始化
unsignedintcapstastus;//定义cap口的电平
uint32time,t2cnt,speed=0,count=0;unsignedpole=2;//极对数
uint32sum=0,average=0;unsignedintl=0,nn=0;
intt2=0;
unsignedinttest[2000],test1[2000],test2[2000];intsss=0;
/***************************************************/
voidmain(void){/*初始化系统*/initsysctrl();/*关中断
*/dint;ier=0x0000;ifr=0x0000;/*初始化pie*/initpiectrl();/*初始化pie矢量表
*/initpievecttable();/*初始化gpio*/gpioinit();/*初始化ad*/initadc();
/*初始化pwm*/init_eva_pwm();
/*初始化
cap*/capinit();eallow;//thisisneededtowritetoeallowprotectedregisterpievecttab le.capint1=&cap_isr;pievecttable.capint2=&cap_isr;pievecttable.capint3=&cap_is r;pievecttable.t1pint=&t1pint_isr;pievecttable.t2pint=&t2pint_isr;
pievecttable.pdpinta=&pdpinta_isr;
edis;//thisisneededtodisablewritetoeallpiectrl.pieier2.bit.intx4=1;//t1pint中断piectrl.pieier3.bit.intx1=1;//t2pint中断piectrl.pieier3.bit.intx5=1;//cap1
中断piectrl.pieier3.bit.intx6=1;//cap2中断piectrl.pieier3.bit.intx7=1;//cap3中断
piectrl.pieier1.bit.intx1=1;//pdpinta中断/*设置ier寄存器*/ier|=m_int1;
ier|=m_int2;//t1pintenable
ier|=m_int3;//captureenable
//enableglobalinterruptsandhigherpriorityreal-
timedebugevents:startmotor();eint;//enableglobalinterruptintmertm;//enableglob alrealtimeinterruptdbgm
//step6.idleloop.justsitandloopforever(optional):while(1){}}
interruptvoidt2pint_isr(void){
count++;
evaregs.evaifrb.bit.t2pint=1;//清除中断标志evaregs.evaimrb.bit.t2pint=1;//中断允许piectrl.pieack.bit.ack3=1;//向cpu申请中断}
interruptvoidcap_isr(void){
/*****以下用来检测传感器的输出电平,用来换向****/uint32kk=t2prd;eallow;
gpiomuxregs.gpamux.bit.cap1q1_gpioa8=0;//预设cap1~3为
gpiogpiomuxregs.gpamux.bit.cap2q2_gpioa9=0;
gpiomuxregs.gpamux.bit.cap3qi1_gpioa10=0;
gpiomuxregs.gpadir.bit.gpioa8=0;//预设cap1~3为输出
gpiomuxregs.gpadir.bit.gpioa9=0;gpiomuxregs.gpadir.bit.gpioa10=0;
capstastus=(gpiodataregs.gpadat.all&0x0700)>>8;
if(dir==1){
switch(capstastus)//ir2136的hin和lin是反向的
{case1:evaregs.actr.all=0x7fd;break;//h3fallcase2:evaregs.actr.all=0xfd7;break ;//h1fallcase3:evaregs.actr.all=0x7df;break;//h2risecase4:evaregs.actr.all=0xd 7f;break;//h2fallcase5:evaregs.actr.all=0xf7d;break;//h1risecase6:evaregs.actr .all=0xdf7;break;//h3rise}}else{switch(capstastus)//ir2136的hin和lin是反向的{case5:evaregs.actr.all=0xfd7;break;//h1risecase1:evaregs.actr.all=0xd7f;break ;//h3fallcase3:evaregs.actr.all=0xdf7;break;//h2risecase2:evaregs.actr.all=0xf
7d;break;//h1fallcase6:evaregs.actr.all=0x7fd;break;//h3risecase4:evaregs.actr .all=0x7df;break;//h2fall}}
/*以下用以排序输出功率*/
t2cnt=evaregs.t2cnt;//读取定时器2的值
time=kk*count+t2cnt;//赢得运转1相所须要时间sum+=time;l++;
if(l==12)//每转12/6/pole计算一下转速{
average=sum/12;
speed=kk*20000*60/(average*6*pole);//计算转速sum=0;l=0;
test[nn]=speed;//测试用,存储速度值nn++;if(nn==2000){nn=0;
}
}
count=0;
evaregs.t2con.all=0x1400;//停用定时器2evaregs.t2cnt=0x0000;
evaregs.t2con.all=0x1440;//启动定时器2
/*************************/
gpiomuxregs.gpamux.bit.cap1q1_gpioa8=1;//重新设定cap1~3为gpiogpiomuxregs.gpamux.bit.cap2q2_gpioa9=1;gpiomuxregs.gpamux.bit.cap3qi1_gpio a10=1;
evaregs.evaifrc.all=7;//清抓取中断
evaregs.capfifo.all=0x01500;//清空捕捉堆栈piectrl.pieack.bit.ack3=1;//cap1中断向cpu申请中断}
interruptvoidt1pint_isr(void){
dcvoltage=(adcregs.result0)>>4;dccurent=(adcregs.result3)>>4;w=(adcregs.result 1)>>4;u=(adcregs.result2)>>4;speedad=(adcregs.result4)>>4;v=(adcregs.result5)> >4;
//母线电压检测,过压维护,
//注:电机在启动或者转动方向改变时,可能母线电压有脉动//采用多次求平均值
sumdcv+=dcvoltage;dcvcount++;
if(dcvcount==500){averagedcv=sumdcv/500;//求平均母线电压
sumdcv=0;dcvcount=0;}
if(averagedcv>=3000){stopmotor();gpiodataregs.gpadat.bit.gpioa11=1;//过压表明}
/******************************/
adcregs.adc_st_flag.bit.int_seq1_clr=1;//去除状态字
adcregs.adctrl2.bit.rst_seq1=1;//登位seq1
evaregs.evaifra.bit.t1pint=1;//清除中断标志
evaregs.evaimra.bit.t1pint=1;//中断容许
piectrl.pieack.bit.ack2=1;//向cpu申请中断}
interruptvoidpdpinta_isr(void){
evaregs.evaifra.bit.pdpinta=1;//清除pdpinta中断标志
piectrl.pieack.bit.ack1=1;//向cpu申请中断
stopmotor();
/***********************************************************************/
//nomore
/***********************************************************************/。