⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer_trigger_adc.c

📁 DSP2407定时器触发ADC
💻 C
📖 第 1 页 / 共 2 页
字号:
{
	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,&current_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 + -