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

📄 calibrationforhmc1052.c

📁 Atmega168+HMC1052+OLED开发指南针
💻 C
字号:
#include "common.h"

void delaytimeforCBRT(void)
{
	uchar n;
	for(n=0;n<4;n++)
	_delay_loop_2(60000);
}

void Sample_XandYaxis(void)
{
int ADC_Xaxis1,ADC_Yaxis1,ADC_Xaxis2,ADC_Yaxis2;
	MAG_POWER_ON;
	_delay_loop_2(60000);
	MAG_RESET;
	_delay_loop_2(60000);
	ADMUX = 0x46;			//AVCC reference channel 6
	ADC_Xaxis1 = AdcConvert();
	ADMUX = 0x47;			//AVCC reference channel 7
	ADC_Yaxis1 = AdcConvert();
	MAG_SET;
	_delay_loop_2(10000);
	ADMUX = 0x46;			//AVCC reference channel 6
	ADC_Xaxis2 = AdcConvert();
	ADMUX = 0x47;			//AVCC reference channel 7
	ADC_Yaxis2 = AdcConvert();
	MAG_POWER_OFF;
	ADC_Xaxis=ADC_Xaxis1-ADC_Xaxis2;
	ADC_Yaxis=ADC_Yaxis1-ADC_Yaxis2;
}

void Calibration(void)
{
int FirstSample_X,FirstSample_Y,Temp_X,Temp_Y;
uchar Quadrant1,Quadrant2,n,NextQuadrant1isOK=0;
Xaxis_MAX=Xaxis_MIN=Yaxis_MAX=Yaxis_MIN=0;

	delaytimeforCBRT();
	Sample_XandYaxis();
	FirstSample_X=ADC_Xaxis;
	FirstSample_Y=ADC_Yaxis;
	
	if(FirstSample_Y>0)
	{if(FirstSample_X>=0) Quadrant1=1;}
	else
	{if(FirstSample_X>0) Quadrant1=4;}
	if(FirstSample_Y>=0)
	{if(FirstSample_X<0) Quadrant1=2;}
	else
	{if(FirstSample_X<=0) Quadrant1=3;}

while(1)
{
	Sample_XandYaxis();
	if(Xaxis_MAX<ADC_Xaxis)
	{
		Xaxis_MAX=ADC_Xaxis;
	}
	if(Xaxis_MIN>ADC_Xaxis)
	{
		Xaxis_MIN=ADC_Xaxis;
	}
	if(Yaxis_MAX<ADC_Yaxis)
	{
		Yaxis_MAX=ADC_Yaxis;
	}
	if(Yaxis_MIN>ADC_Yaxis)
	{
		Yaxis_MIN=ADC_Yaxis;
	}

	if(ADC_Yaxis>0)
	{if(ADC_Xaxis>0) Quadrant2=1;}
	else if(ADC_Yaxis<0)
	{if(ADC_Xaxis>0) Quadrant2=4;}
	if(ADC_Yaxis>0)
	{if(ADC_Xaxis<0) Quadrant2=2;}
	else if(ADC_Yaxis<0)
	{if(ADC_Xaxis<0) Quadrant2=3;}
	if((Quadrant2!=Quadrant1)&(!NextQuadrant1isOK))
	{
		Quadrant1=Quadrant2;
		NextQuadrant1isOK=1;
	}
	if((Xaxis_MAX>0)&(Xaxis_MIN<0)&(Yaxis_MAX>0)&(Yaxis_MIN<0))
	{
		if(Quadrant2==Quadrant1) HMC1052CalibrationisOK=1;
	}

	if(HMC1052CalibrationisOK) break;
	if(KeyValue)
	{
		_delay_loop_1(100);
		if(KeyValue)
		{	
			while(KeyValue);
			break;
		}
	}	
}

Xsf=(float)(Yaxis_MAX-Yaxis_MIN)/(Xaxis_MAX-Xaxis_MIN);
if(Xsf<1.0) 
{
 Ysf=1.0/Xsf;
 Xsf=1.0;
}
else Ysf=1.0;
Xoff=((Xaxis_MAX+Xaxis_MIN)>>1)*Xsf;
Yoff=((Yaxis_MAX+Yaxis_MIN)>>1)*Ysf;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -