📄 16f884.c
字号:
temp_dis_buffer0(0,0,0,0);temp_dis_buffer1(0,0,0,0);
re_start_init();work_led=1; }
else if(ext)
{ext=0;RUN=0;R_W_OVER=0;
temp_dis_buffer0(0,0,0,11);temp_dis_buffer1(18,18,18,18);temp_dis_buffer2(18,18,18,18);i=0;}
else if(up)up=0;
else if(down)down=0; }
if(ms_2)
{display();ms_2=0;}
}//while(RUN)
}
}//main
void interrupt ISR(void)
{
if(TMR2IF)//(正半周)占空比为:PR2/2+range*正玄值
{TMR2IF=0;
if(zhengbanzhou)
{CCPR1L=new_pdc;GODONE=1;//8位占空比寄存器,低2位被舍去(如要提高精度,需设置低2位)
new_pdc=pwm_data[point++];
new_pdc=new_pdc*range;
new_pdc=new_pdc>>9;
new_pdc+=(PR2/2);
if(point>(dianshu-1)){point=0;zhengbanzhou=0;}
}
else//(负半周)占空比为:PR2/2-range*正玄值
{CCPR1L=new_pdc;GODONE=1;
new_pdc=pwm_data[point++];
new_pdc=new_pdc*range;
new_pdc=new_pdc>>9;
new_pdc=(PR2/2)-new_pdc;
if(point>dianshu-1)
{point=0;zhengbanzhou=1;
if(update_range)//由于MCU的PID算法占用过多时间,无法每周计算更新range(幅度控制寄存器)
{range=RDY_RANGE;ADCON0=161;ADCON1=0;ADIF=0;ADIE=1;AD_OVER=0;update_range=0;}//,因此设置2周更新一次
else {update_range=1;PWM_LAST=1;}//缺点:卸载时电压响应速度不够(补偿方法,卸载时2倍速度控制降低)
}
}
}
if(ADIF)//AD采集2路信号需动态切换AD多路开关
{ADIF=0;
if(AD_VOL)
{AD_VOL_SUM=AD_VOL_SUM+ADRESH;AD_VOL=0;ADCON0=149;}//多路开关切换到AN5采集VPP(峰—峰值)
else if(check_vpp_over)
{AD_VPP_SUM=AD_VPP_SUM+ADRESH;ADCON0=161;AD_VOL=1;}//多路开关切换到AN8采集VOL(平均值)
else {ADCON0=161;AD_VOL=1;}
if(PWM_LAST)
{ADON=0;ADIE=0;AD_OVER=1;SAV_AD_VOL_SUM=AD_VOL_SUM;SAV_AD_VPP_SUM=AD_VPP_SUM;AD_VOL_SUM=0;AD_VPP_SUM=0;}
}
else if(T0IF)//T0负责2个MS的时间到时刷新显示,第2功能是键盘动作时间设置为0.5S防止按一次,出现多次动作
{T0IF=0;ms_2=1;
if(RABIE==0)
{ms2_counter++;RABIF=0;if(ms2_counter>251){RABIE=1;ms2_counter=0;}}
}
else if(C1IF)
{C1IF=0;if(C1OUT)check_vpp_over=0;
else check_vpp_over=1;}//如果VPP引脚电压高于1.45833V,开始采样VPP
else if(INTF)//转速脉冲采集,计算在主程序进行
{INTF=0;T1L[INT_COUNTER]=TMR1L;T1H[INT_COUNTER]=TMR1H;TMR1L=0;TMR1H=0;INT_COUNTER++;
if(INT_COUNTER>9){INT_COUNTER=0;INT_OVER=1;} }
else if(RBIF)//有键按下时,保存端口数据
{key_data_temp=PORTB;RBIF=0;key_data_temp>>=4;
if(key_data_temp!=0xf)
key_data=key_data_temp;
else
{RAB=1;RABIE=0;}
}
}
void display(void )
{
unsigned char temp_h,temp_l;
temp_h=display_buffer[dis_i]&0xf0;//查表高位数据内容
temp_l=display_buffer[dis_i]&0x0f;//查表低位数据内容
if(dis_i==0){PORTA=0;PORTC=temp_h;PORTD=temp_l|128;}
else if(dis_i==1){PORTA=0;PORTC=temp_h;PORTD=temp_l|64;}
else if(dis_i==2){PORTA=0;PORTC=temp_h;PORTD=temp_l|16;}
else if(dis_i==3){PORTA=0;PORTC=temp_h|8;PORTD=temp_l;}
else if(dis_i==4){PORTA=0;PORTC=temp_h|2;PORTD=temp_l;}
else if(dis_i==5){PORTA=0;PORTC=temp_h|1;PORTD=temp_l;}//g
else if(dis_i==6){PORTA=32;PORTC=temp_h;PORTD=temp_l;}
else if(dis_i==7){PORTA=16;PORTC=temp_h;PORTD=temp_l;}
else if(dis_i==8){PORTA=8;PORTC=temp_h;PORTD=temp_l;}
else if(dis_i==9){PORTA=4;PORTC=temp_h;PORTD=temp_l;}
else if(dis_i==10){PORTA=2;PORTC=temp_h;PORTD=temp_l;}
else {PORTA=1;PORTC=temp_h;PORTD=temp_l;}
dis_i++;
if(dis_i>11)dis_i=0;
}
void key_identify(void)//键盘识别
{
if(key_data==14)ext=1;//exit
else if(key_data==13)up=1;//UP
else if(key_data==11)down=1;//DOWN
else if(key_data==7)ok=1;//OK
}
void temp_dis_buffer0(unsigned char bit3,unsigned char bit2,unsigned char bit1,unsigned char bit0)
{
display_buffer[3]=display_data[bit3];
display_buffer[2]=display_data[bit2];
display_buffer[1]=display_data[bit1];
display_buffer[0]=display_data[bit0];
}
void temp_dis_buffer1(unsigned char bit3,unsigned char bit2,unsigned char bit1,unsigned char bit0)
{
display_buffer[7]=display_data[bit3];
display_buffer[6]=display_data[bit2];
display_buffer[5]=display_data[bit1];
display_buffer[4]=display_data[bit0];
}
void temp_dis_buffer2(unsigned char bit3,unsigned char bit2,unsigned char bit1,unsigned char bit0)
{
display_buffer[11]=display_data[bit3];
display_buffer[10]=display_data[bit2];
display_buffer[9]=display_data[bit1];
display_buffer[8]=display_data[bit0];
}
void READEEPROM(unsigned char ee_i)
{unsigned char ee_ddr=0;
ee_ddr=ee_i<<4;
EECON1=0;
EEADRL=ee_ddr+0;
RD=1;
EE_ZHUANSU[0]=EEDAT;
EEADRL=ee_ddr+1;
RD=1;
EE_ZHUANSU[1]=EEDAT;
EEADRL=ee_ddr+2;
RD=1;
EE_ZHUANSU[2]=EEDAT;
EEADRL=ee_ddr+3;
RD=1;
EE_VPP[0]=EEDAT;
EEADRL=ee_ddr+4;
RD=1;
EE_VPP[1]=EEDAT;
EEADRL=ee_ddr+5;
RD=1;
EE_VPP[2]=EEDAT;
EEADRL=ee_ddr+6;
RD=1;
EE_VOL[0]=EEDAT;
EEADRL=ee_ddr+7;
RD=1;
EE_VOL[1]=EEDAT;
EEADRL=ee_ddr+8;
RD=1;
EE_VOL[2]=EEDAT;
}
void WRITEEEPROM(unsigned char ee_i)
{unsigned char ee_ddr=0;
////待功能完善
}
void BIN_BCD_COUNTER(unsigned int data)///BCD码切换程序,效率较除法、取余要高,入口参数十进制数据data
{BCD_DATA[3]=0;BCD_DATA[2]=0;BCD_DATA[1]=0;BCD_DATA[0]=0;//////出口参数BCD_DATA[]
while((int)(data-1000)>0)
{BCD_DATA[3]++;data-=1000;}
while((int) (data-100)>0)
{BCD_DATA[2]++;data-=100;}
while((int) (data-10)>0)
{BCD_DATA[1]++;data-=10;}
BCD_DATA[0]=data;
}
void re_start_init(void)//初始代码和各个寄存器
{GIE=0;start=1;RDY_RANGE=70;range=RDY_RANGE;
SAV_AD_VOL_SUM=0;SAV_AD_VPP_SUM=0;AD_VOL_SUM=0;AD_VPP_SUM=0;
ms2_counter=0;point=0;update_range=0;
re_start=1;Sum_err=0;RUN=1;
TMR1L=0;TMR1H=0;INT_COUNTER=0;zhuangtai=3;
for(temp_i=0;temp_i<9;temp_i++)
{zhuansu[temp_i]=0;T1H[temp_i]=0;T1L[temp_i]=0;}
for(temp_i=0;temp_i<2;temp_i++)
AC_errr[temp_i]=0;
initial_ad();
initial_pwm();
intital_other();
ADIF=0;ADIE=1;TMR2IF=0;C1IF=0;TMR2=0;TMR2ON=1;RABIF=0;GIE=1;C1ON=1;
}
unsigned int sin_table_calculate(unsigned char zhouqi,unsigned char dianshu)//zhouqi为PWM的周期,点数为半周点数
{////////////////////////////////////////////////////////////////////输出波形频率为:1/(周期*点数*2*4)
float dushu,dushu_sum=0;
unsigned char i;
unsigned int lixiangzhuansu;
PR2=zhouqi*4-1;
dushu=180/(float)dianshu;
GIE=0;
for(i=0;dianshu>0;dianshu--)
{pwm_data[i]=PR2/2*sin(dushu*i*0.0174532925);
clrwdt();i++;}
lixiangzhuansu=125000/(zhouqi*dianshu);
GIE=1;
return(lixiangzhuansu);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -