📄 timer_trigger_adc.c
字号:
{
long temp1,temp2,temp3;
*ualpha = ua>>1;
temp1 = CONST1*(long)ua;/*Q3.29*/
temp2 = CONST2*(long)ub;/*Q3.29*/
temp1 = temp1<<1;/*Q2.30*/
temp2 = temp2<<1;/*Q2.30*/
temp3 = temp1 + temp2;
temp3 = temp3>>16;
*ubeta =(int)temp3;/*truncated*/
return 0;
}
/*angle~Q4.12*/
/*sin_value~cos_value~Q1.15*/
/*Q1.15~2*pi/256~803*/
static int sin_cal(int angle,int *sin_value)
{
int serial_num;/*Q9.7*/
long temp_angle;/*Q20.12*/
int neg_flag = 0;
if(angle<0)
{
angle=~angle+1;
neg_flag = 1;
}
temp_angle=(long)angle;/*Q20.12*/
temp_angle=temp_angle<<10;/*Q10.22*/
serial_num=temp_angle/803;/*Q10.22/Q1.15=Q9.7*/
serial_num=serial_num>>7;/*Q16.0*/
*sin_value = sin_array_fixed_point[serial_num];/*Q1.15*/
if(neg_flag)
{
*sin_value=~(*sin_value)+1;
}
return 0;
}
/*2*pi~Q4.12~25735*/
static int cos_cal(int angle,int *cos_value)
{
int serial_num;/*Q9.7*/
long temp_angle;/*Q20.12*/
/*restrict scale*/
if(angle<0)angle = ~angle+1;
temp_angle=(long)angle;/*20.12*/
temp_angle=temp_angle<<10;/*Q10.22*/
serial_num=temp_angle/803;/*Q10.22/Q1.15=Q9.7*/
serial_num=serial_num>>7;/*Q16.0*/
*cos_value=cos_array_fixed_point[serial_num];/*Q1.15*/
return 0;
}
/*sin_value~Q1.15_cos_value~Q1.15_ualpha~Q2.14_ubeta~Q2.14_mac_value~Q3.13*/
int mac(int sin_value,int cos_value,int ualpha,int ubeta,int *mac_value)
{
long temp_beta;
long temp_alpha;
long temp_mac_value;
temp_beta = (long)sin_value*ubeta;/*Q1.15*Q2.14=Q3.29*/
temp_alpha =(long)cos_value*ualpha;/*Q1.15*Q2.14=Q3.29*/
temp_mac_value = temp_beta+temp_alpha;/*3.29*/
temp_mac_value = temp_mac_value>>16;/*Q19.13*/
*mac_value=(int)temp_mac_value;/*trucated_Q3.13*/
return 0;
}
/*u_a,u_b~Q1.15*/
/*theta~Q4.12*/
int robust_PLL(int u_a,int u_b,int *theta)
{
int u_alpha;
int u_beta;
int u_out_alpha;
int u_out_beta;
int theta_ref=0;/*Q3.13*/
int sin_theta;/*Q1.15*/
int cos_theta;/*Q1.15*/
int ret;
static int previous_theta_feedback;/*Q3.13*/
static int current_theta_feedback;/*Q3.13*/
int error_theta;/*Q3.13*/
int LF_output;/*Q2.14*/
error_theta = theta_ref+~previous_theta_feedback+1;/*Q3.13*/
error_theta=error_theta<<1;/*Q2.14*/
clarke_trans(u_a,u_b,&u_alpha,&u_beta);
multi_var_filter(u_alpha,u_beta,&u_out_alpha,&u_out_beta);
loop_filter(error_theta,&LF_output);
ret = VCO(LF_output,theta);
if(ret)
{
return -1;
}
sin_cal(*theta,&sin_theta);/*error*/
cos_cal(*theta,&cos_theta);
mac(sin_theta,cos_theta,u_out_alpha,u_out_beta,¤t_theta_feedback);
previous_theta_feedback=current_theta_feedback;/*update~Q3.13*/
return 0;
}
/*关中断*/
void inline disable(void)
{
asm(" SETC INTM");
}
/*开总中断*/
void inline enable(void)
{
asm(" CLRC INTM");
}
void systemInit(void)
{
asm(" SETC SXM");/*符号位扩展有效*/
asm(" CLRC OVM");/*累加器结果正常溢出*/
asm(" CLRC CNF");/*B0块配置为数据空间*/
*SCSR1 = 0x81fe;/*CLKOUT = 4*FIN*/
*WDCR = 0x0eb;/*禁止看门狗*/
*IMR = 0x0001;/*使能INT1中断*/
*IFR = 0xffff;/*清中断标志位*/
}
/*AD初始化子程序*/
void adInit(void)
{
*T4CNT = 0x0000;/*T4计数器清零*/
*T4CON = 0x170C;/*连续增计数模式~使用自身使能位~禁止定时器操作~禁止比较操作~使用自己的周期寄存器*/
*T4PR = 0xffff;/*周期寄存器值*/
*GPTCONB = 0x400;/*使用周期中断标志来启动模数转换*/
*EVBIFRB = 0x0FFFF;/*清EVB中断标志*/
*ADCTRL1 = 0x4000;/*ADC模块复位*/
asm(" NOP");
*ADCTRL1 = 0x10;/*采用级联模式~高优先级中断~启动停止模式*/
*ADCTRL2 = 0x4040;/*复位排序器*/
*ADCTRL2 = 0x8404;/*允许级联排序器SEQ由EVB的信号来启动~中断模式1~*/
*MAXCONV = 0x01;/*转换通道个数为2*/
*CHSELSEQ1=0x0040;
/*not valid*/
*CHSELSEQ2=0x7654;
*CHSELSEQ3=0xBA98;
*CHSELSEQ4=0xFEDC; /* 转换通道是0,15*/
}
void ioInit(void)
{
*MCRC=0x0000;
*PFDATDIR=0xFF00;
}
/*启动AD转换子程序~通过启动定时器4间接启动*/
void adSoc(void)
{
*T4CON = *T4CON | 0x40;/*启动timer4*/
}
void interrupt nothing(void)
{
asm(" CLRC INTM");
return;
}
/*AD中断服务子程序*/
void interrupt adInt(void)
{
asm(" CLRC SXM");/*抑制符号位扩展*/
adresult_ua_0_ch = *RESULT0>>6;/*Q16.0->Q1.15*/
adresult_ub_4_ch = *RESULT1>>6;/*Q16.0->Q1.15*/
j=1;/*j=1表示一次转换完成*/
}
void main(void)
{
int ret;
/*angle~5*pi/6 2.618 rad*/
int angle_test;/*Q4.12*/
int sin_value;
angle_test = 10723;
cos_cal(angle_test,&sin_value);
disable();/*禁止总中断*/
systemInit();/*系统初始化*/
adInit();/*AD初始化*/
ioInit();/*IO初始化*/
enable();/*开放总中断*/
adSoc();/*启动定时器启动AD转换*/
while(1)
{
if(j == 1)/*AD转换完成一次之后*/
{
j = 0;
*T4CON=*T4CON & 0xFFBF;/*停止定时器~间接停止AD转换*/
/*delay();*/
/*一次转换完成~LED指示*/
if((*PFDATDIR&0x0001) == 0x0001)
*PFDATDIR = 0xFFaa;
else
*PFDATDIR = 0xff55;
/*u_a,u_b~Q1.15*/
/*theta~Q4.12*/
ret = robust_PLL(adresult_ua_0_ch,adresult_ub_4_ch,&theta);/*calucate*/
if(ret)
{
*PFDATDIR = 0xffff;/*vco's error warning*/
}
*T4CNT = 0x0000;/*复位计数器*/
*ADCTRL2 = *ADCTRL2 | 0x4200;/*复位排序器且清中断标志位*/
enable();
adSoc();/*启动AD转换*/
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -