|
楼主 |
发表于 2014-3-28 10:11:44
|
显示全部楼层
我的滤波函数,每次PWM采集一次AD值
- unsigned char filter_table[8]={0,1,1,2,1,2,2,3};
- tableA[Tab_Cnt] = ADRES00;//将AD值存到TABLE中
- tableB[Tab_Cnt] = ADRES01;
- tableC[Tab_Cnt] = ADRES02;
- tableM[Tab_Cnt] = ADRES03;
- V_Cnt++;
- Tab_Cnt++;
- if(Tab_Cnt>=5){
- Tab_Cnt = 0;
- }
- if(V_Cnt>=5)
- {
- Voltage_A = (tableA[0]+tableA[1]+tableA[2]+tableA[3]+tableA[4])/5;//取平均值
- Voltage_B = (tableB[0]+tableB[1]+tableB[2]+tableB[3]+tableB[4])/5;
- Voltage_C = (tableC[0]+tableC[1]+tableC[2]+tableC[3]+tableC[4])/5;
- Voltage_M = (tableM[0]+tableM[1]+tableM[2]+tableM[3]+tableM[4])/5;
-
- if(Voltage_A>=Voltage_M ){//如果大于中点则某位为1否则为0
- filter_phase_A = (filter_phase_A<<1)|0x01;
- }else{
- filter_phase_A = (filter_phase_A<<1);
- }
- if(Voltage_B>=Voltage_M ){
- filter_phase_B = (filter_phase_B<<1)|0x01;
- }else{
- filter_phase_B = (filter_phase_B<<1);
- }
- if(Voltage_C>=Voltage_M ){
- filter_phase_C = (filter_phase_C<<1)|0x01;
- }else{
- filter_phase_C = (filter_phase_C<<1);
- }
- //判断过零否
- //由滤波数filter_phase_A的高三位的1/0的个数与第三位1/0的个数比较得出
- filter_cnt++;
- if(filter_cnt>=6){
- tmp_filter = filter_phase_A;
- num_low = filter_table[tmp_filter&0x07];
- num_high = filter_table[(tmp_filter>>3)&0x07];
- if((num_high<=1)&&(num_low>=2)){//A相上升过零点
- if(control_flags.dir==CW){//正反转标志
- tmp_sector = 0;
- }else{
- tmp_sector = 1;
- }
- }else if((num_high>=2)&&(num_low<=1)){//A相下降过零点
- if(control_flags.dir==CW){
- tmp_sector = 3;
- }else{
- tmp_sector = 4;
- }
- }
- tmp_filter = filter_phase_B;
- num_low = filter_table[tmp_filter&0x07];
- num_high = filter_table[(tmp_filter>>3)&0x07];
- if((num_high<=1)&&(num_low>=2)){//B相上升过零点
- if(control_flags.dir==CW){
- tmp_sector = 2;
- }else{
- tmp_sector = 3;
- }
- }else if((num_high>=2)&&(num_low<=1)){//B相下降过零点
- if(control_flags.dir==CW){
- tmp_sector = 5;
- }else{
- tmp_sector = 0;
- }
- }
- tmp_filter = filter_phase_C;
- num_low = filter_table[tmp_filter&0x07];
- num_high = filter_table[(tmp_filter>>3)&0x07];
- if((num_high<=1)&&(num_low>=2)){//C相上升过零点
- if(control_flags.dir==CW){
- tmp_sector = 4;
- }else{
- tmp_sector = 5;
- }
- }else if((num_high>=2)&&(num_low<=1)){//C相下降过零点
- if(control_flags.dir==CW){
- tmp_sector = 1;
- }else{
- tmp_sector = 2;
- }
- }
- }
- }
复制代码 |
|