?? ad.c
字號:
#include "MSP430x14x.h"
#define ADCMEM ((int*) 0x0140) // ADC12MEMx 定義
unsigned int Result[3]; //用以保存轉換結果
float ad_result[3];
//float vol_a01[5]={1.8302, 2.101,2.365, 2.635, 2.907},pressure_a01[5]={20,24,28,32,36};//一
//float vol_a01[5]={1.8302, 2.101,2.365, 2.635, 2.907},pressure_a01[5]={20,24,28,32,36};//二
float vol_a01[5]={2.2, 2.480,2.76, 3.02, 3.3},pressure_a01[5]={20,24,28,32,36};//三(進傳感)
// float vol_a01[5]={0.717, 1.650,2.614, 3.55, 4.47},pressure_a01[5]={0,15,30,45,60};//三(進傳感)
float vol_a10[5]={2.2, 2.480,2.76, 3.02, 3.3},pressure_a10[5]={20,24,28,32,36};//from high to low 10
float vol_b01[5]={2.2, 2.480,2.76, 3.02, 3.3},pressure_b01[5]={20,24,28,32,36};
float vol_b10[5]={2.2, 2.480,2.76, 3.02, 3.3},pressure_b10[5]={20,24,28,32,36};
/*
float vol_a01[5]={1.858, 2.1,2.3, 2.6, 2.9},pressure_a01[5]={20,24,28,32,36};// from low to high 01
float vol_a10[5]={1.848, 2.115,2.381, 2.65, 2.912},pressure_a10[5]={20,24,28,32,36};//from high to low 10
float vol_b01[5]={1.868, 2.142,2.409, 2.688, 2.959},pressure_b01[5]={20,24,28,32,36};
float vol_b10[5]={1.858, 2.125,2.386, 2.661, 2.926},pressure_b10[5]={20,24,28,32,36};
*/
float a[2];
float a_01[2],a_10[2],b_01[2],b_10[2],a00[2],b00[2];
int s_a,s_b;
#define delta_s 10 //定義上壓,下壓差值
//--------------------------------------------------------------------------
void Init_ad(void); // Initialization of System/Control Registers
void ad_process();
void sensor_calculate(float voltage[5], float pressure[5]);
void sensor_Init();
//Parameter init
void sensor_Init()
{
//a sensor
sensor_calculate(vol_a01,pressure_a01); //01
a_01[0]=a[0];a_01[1]=a[1];
sensor_calculate(vol_a10,pressure_a10);//10
a_10[0]=a[0];a_10[1]=a[1];
///////////b sensor
sensor_calculate(vol_b01,pressure_b01); // from low to high 01
b_01[0]=a[0];b_01[1]=a[1];
sensor_calculate(vol_b10,pressure_b10);//from high to low 10
b_10[0]=a[0];b_10[1]=a[1];
a00[0]=a_01[0]; a00[1]=a_01[1]; //設置初值
b00[0]=b_01[0]; b00[1]=b_01[1];
}
void sensor_calculate(float voltage[5], float pressure[5])
{
float a11=0,a12=0,a21=0,a22=0;
float b11=0,b21=0;
a11=5;
a12=voltage[0]+voltage[1]+voltage[2]+voltage[3]+voltage[4];
a21=a12;
a22=voltage[0]*voltage[0]+voltage[1]*voltage[1]+voltage[2]*voltage[2]+voltage[3]*voltage[3]+voltage[4]*voltage[4];
b11=pressure[0]+pressure[1]+pressure[2]+pressure[3]+pressure[4];
b21=voltage[0]*pressure[0]+voltage[1]*pressure[1]+voltage[2]*pressure[2]+voltage[3]*pressure[3]+voltage[4]*pressure[4];
//calculate the pra
a[0]=a22/(a11*a22-a12*a21)*b11-a12/(a11*a22-a12*a21)*b21;
a[1]= -a21/(a11*a22-a12*a21)*b11+a11/(a11*a22-a12*a21)*b21;
//return(a[0]);
}
void ad(void)
{
unsigned int i;
unsigned int j;
// unsigned int Result[3]; //用以保存轉換結果
// Init(); //對ADC進行初始化
// while (1)
//{
Init_ad();
for (i=0;i<3;i++)
{
ADC12CTL0 |= 0x01; // 開始轉換
ADC12CTL0 &=~0x01;
for (j=0;j<=1000;j++); // 延時,準備觸發序列中的下一次轉換
}
while ((ADC12CTL1&0x01)==1); // 等待整個序列的轉換完成
for(j = 0 ; j <3; j++)
{
Result[j] = ADCMEM[j];
}
for (i=0;i<=2000;i++); // 兩個序列之間的一個延時
//}
}
////////////////
#define a_limit 20 //ad sample limit scope.
void ad_converter(unsigned p)//循環ad采樣p遍
{
int ad_0[60], ad_1[60], ad_2[60],ad_temp1,ad_temp2,ad_temp3;
float s0=0,s1=0,s2=0;
unsigned char j,i;
for (int i=0;i<p;i++)
{
ad();
//////2007-8-16 First use the limit scope method , then use average method filter
ad_0[i]=Result[0];
ad_1[i]=Result[1];
ad_2[i]=Result[2];
/*
if (0==i)
{
ad_0[i]=Result[0];
ad_1[i]=Result[1];
ad_2[i]=Result[2];
}
if (i>=1)
{
//////////////////////// 0
ad_0[i]= ( ( ( Result[0] - ad_0[i-1] > a_limit ) || ( ad_0[i-1] - Result[0] > a_limit )) ? ad_0[i-1] : Result[0] );
/////////////////////// 1
if ( ( Result[1] - ad_1[i-1] > a_limit ) || ( ad_1[i-1] - Result[1] > a_limit ))
// {
ad_1[i]=ad_1[i-1];
// }
else
// {
ad_1[i]=Result[1];
// }
///////////////////////////2/
if ( ( Result[2] - ad_2[i-1] > a_limit ) || ( ad_2[i-1] - Result[2] > a_limit ))
{
ad_2[i]=ad_2[i-1];
}
else
{
ad_2[i]=Result[2];
}
/////////////////////////////
}
*/
}
////////////////2007-8-13 放棄取平均值方法
/*
for (int i=0;i<p;i++)
{
s0+=ad_0[i];
s1+=ad_1[i];
s2+=ad_2[i];
}
s0=s0/p;// 取平均值
s1=s1/p;
s2=s2/p;
*/
////////////////2007-8-13 放棄取平均值方法
//////2007-8-13 采用中值平均濾波法,abandon the Max and Min.
for (j=0;j<p-1;j++)
{
for (i=0;i<p-j;i++)
{
if ( ad_0[i]>ad_0[i+1] )
{
ad_temp1 = ad_0[i];
ad_0[i] = ad_0[i+1];
ad_0[i+1] =ad_temp1;
}
}
}
///////////////////////
for (j=0;j<p-1;j++)
{
for (i=0;i<p-j;i++)
{
if ( ad_1[i]>ad_1[i+1] )
{
ad_temp2 = ad_1[i];
ad_1[i] = ad_1[i+1];
ad_1[i+1] =ad_temp2;
}
}
}
////////////////
for (j=0;j<p-1;j++)
{
for (i=0;i<p-j;i++)
{
if ( ad_2[i]>ad_2[i+1] )
{
ad_temp3 = ad_2[i];
ad_2[i] = ad_2[i+1];
ad_2[i+1] =ad_temp3;
}
}
}
//////////
unsigned char counter_n=3, cha=80; // 最大最小差值不大于20 2007-9-27
/*
for (int i=3;i<p-3;i++)
{
s0+=ad_0[i];
s1+=ad_1[i];
s2+=ad_2[i];
}
*/
for (int i=0;i<10;i++) //自動篩選最大最小次數,最多剔除20個數。
{
if( ((ad_0[p-counter_n]-ad_0[counter_n])>cha)||((ad_1[p-counter_n]-ad_1[counter_n])>cha)) counter_n++;
}
for (int i=counter_n;i<p-counter_n;i++)
{
s0+=ad_0[i];
s1+=ad_1[i];
s2+=ad_2[i];
}
s0=s0/(p-2*counter_n); // 取平均值
s1=s1/(p-2*counter_n);
s2=s2/(p-2*counter_n);
// if ((s0-s_a)>=delta_s) {a00[0]=a_01[0]; a00[1]=a_01[1]; s_a=s0;}
// if ((s_a-s0)>=delta_s) {a00[0]=a_10[0]; a00[1]=a_10[1]; s_a=s0;}
/////////////
// if ((s1-s_b)>=delta_s) {b00[0]=b_01[0];b00[1]=b_01[1]; s_b=s1;}
// if ((s_b-s1)>=delta_s) {b00[0]=b_10[0]; b00[1]=b_10[1]; s_b=s1;}
/////////////
// 轉換電壓
//ad_result[0]=(3.26*s0)/4095 ;
ad_result[0]=(2.486*s0)/4095 ;
//
// ad_result[1]=(3.26*s1)/4095 ;
ad_result[1]=(2.486*s1)/4095 ;
ad_result[2]=(3.26*s2)/4095 ; //XIUGAI
//ad_result[2]=(3.3*s2)/4095 ;
////
// ad_result[0]=ad_result[0]*2;
ad_result[0]=a00[0]+a00[1]*ad_result[0]*2.0 ;////
//ad_result[0]=(ad_result[0]*2-0.5036)*11.6822;
// ad_result[1]=ad_result[1];
ad_result[1]=b00[0]+b00[1]*ad_result[1]*2.02 ; //由于電阻精度不滿足要求,所以每次焊接調試時要測量這個比。
// ad_result[2]=(ad_result[2]*99.96)/19.952 ;//
// ad_result[2]=ad_result[2]*6.019;//根據電路測量。
//ad_result[2]=ad_result[2];
}
void Init_ad(void)
{
WDTCTL = WDTPW + WDTHOLD; // 停止Watchdog
/* ADC12 Settings: */
P6SEL |= 0xff; // 所有P6口線均為ADC模塊使用
ADC12CTL0 &=~ 0x02; // 在進行設置時首先復位ADC的轉換使能
// ADC12CTL0 |= SHT0_8;
ADC12CTL0 |= REF2_5V;
ADC12CTL0 |= REFON;
//ADC12CTL1 |= ADC12DIV2;
ADC12MCTL0 = 0x10; // 參考電壓ref+=AVcc, 輸入通道選擇為 A0
ADC12MCTL1 = 0x12; // 參考電壓ref+=AVcc, 輸入通道選擇為 A2
ADC12MCTL2 = SREF_0+INCH_4+EOS;; // 參考電壓ref+=AVcc, 輸入通道選擇為 A4 // ADC12MCTL1 是最后一個轉換通道
ADC12CTL1 |=0x021A; // ADC12SC 位觸發采樣和保持
// 采樣脈沖由采樣定時器產生
// 時鐘源:內部振蕩器
// 時鐘分頻: 1
// 轉換模式: 多通道、單次轉換
ADC12CTL0 |= 0x0010+SHT0_1;
ADC12CTL0 |= 0x02; // 使能ADC轉換
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -