#include "TLC2543.h"
double v12v = 0.0;
double v28v1 = 0.0;
double v28v2 = 0.0;
double v28v1_1 = 0.0;
double v28v1_2 = 0.0;
double v28v1_3 = 0.0;
double v28v1_4 = 0.0;
double v28v1_5 = 0.0;
double v28v1_6 = 0.0;
double v28v2_1 = 0.0;
double v28v2_2 = 0.0;
double i12v = 0.0;
double i28v1 = 0.0;
double i28v2 = 0.0;
double i28v1_1 = 0.0;
double i28v1_2 = 0.0;
double i28v1_3 = 0.0;
double i28v1_4 = 0.0;
double i28v1_5 = 0.0;
double i28v1_6 = 0.0;
double i28v2_1 = 0.0;
double i28v2_2 = 0.0;
u16 adcx,adc_val;
float temp,voltage;
u8 flag=0;
extern u8 promise_380vin_flag; //380v输入标注,电流校准使用
void TLC2543_GPIO_Config(void)
{
rcu_periph_clock_enable(RCU_AF);//开启复用外设时钟使能
gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);//重映射
//使能时钟
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
//使能管脚
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SCK1_GPIO_PIN|SDI1_GPIO_PIN);
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, SDO1_GPIO_PIN|EOC1_GPIO_PIN);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, CS1_GPIO_PIN);
}
u16 GetChannelVal(u8 port)
{
u8 i;
u16 adval;
if(port > 0x0F) //防止模拟输入大于5V
return 0;
delay_us(6);
SCK1_GPIO_L;
delay_us(6);
CS1_GPIO_L;
delay_us(6);
port <<= 4;
adval=0;
for(i=0; i<12; i++)
{
if(SDO1_GPIO_READ)
adval |= 0x01;
if(port&0x80)
SDI1_GPIO_H;
else
SDI1_GPIO_L;
delay_us(6);
SCK1_GPIO_H;
delay_us(6);
SCK1_GPIO_L;
port<<=1;
adval<<=1;
}
delay_us(6);
CS1_GPIO_H;
adval>>=1;
return(adval);
}
u16 Get_Adc_Average(u8 chan,u8 times)//数字滤波。多次测量求平均值减少误差
{
u32 temp_val=0,temp_val_sum=0,temp_val_min=0,temp_val_max=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val = GetChannelVal(chan);
if(t==0)
{
temp_val_min = temp_val;
temp_val_max = temp_val;
}
if(temp_val_min < temp_val)
{
temp_val_min = temp_val;
}
if(temp_val_max > temp_val)
{
temp_val_max = temp_val;
}
temp_val_sum = temp_val_sum + temp_val;
delay_us(100);
}
temp_val_sum = temp_val_sum - temp_val_min - temp_val_max;
times = times - 2;
return temp_val_sum/times;
}
void TLC2543_GPIO_Config_I(void)
{
//使能时钟
rcu_periph_clock_enable(RCU_GPIOB);
//使能管脚
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, SCK_GPIO_PIN|CS_GPIO_PIN|SDI_GPIO_PIN);
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, SDO_GPIO_PIN|EOC_GPIO_PIN);
}
u16 GetChannelVal_I(u8 port)
{
u8 i;
u16 adval;
if(port > 0x0F) //防止模拟输入大于5V
return 0;
delay_us(6);
SCK_GPIO_L;
delay_us(6);
CS_GPIO_L;
delay_us(6);
port <<= 4;
adval=0;
for(i=0; i<12; i++)
{
if(SDO_GPIO_READ)
adval |= 0x01;
if(port&0x80)
SDI_GPIO_H;
else
SDI_GPIO_L;
delay_us(6);
SCK_GPIO_H;
delay_us(6);
SCK_GPIO_L;
port<<=1;
adval<<=1;
}
delay_us(6);
CS_GPIO_H;
adval>>=1;
return(adval);
}
u16 Get_Adc_Average_I(u8 chan,u8 times)//数字滤波。多次测量求平均值减少误差
{
u32 temp_val=0,temp_val_sum=0,temp_val_min=0,temp_val_max=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val = GetChannelVal_I(chan);
if(t==0)
{
temp_val_min = temp_val;
temp_val_max = temp_val;
}
if(temp_val_min < temp_val)
{
temp_val_min = temp_val;
}
if(temp_val_max > temp_val)
{
temp_val_max = temp_val;
}
temp_val_sum = temp_val_sum + temp_val;
delay_us(100);
}
temp_val_sum = temp_val_sum - temp_val_min - temp_val_max;
times = times - 2;
return temp_val_sum/times;
}
void collect_clm2543(u8 type,u8 ch)
{
if(type == V_CLM2543)
{
switch(ch)
{
case V12V_CH:
{
v12v = (Get_Adc_Average(V12V_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 11.0);
if(v12v <= 0.0)
{
v12v = 0.0;
}
break;
}
case V28V1_CH:
{
v28v1 = (Get_Adc_Average(V28V1_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v1 <= 0.0)
{
v28v1 = 0.0;
}
break;
}
case V28V2_CH:
{
v28v2 = (Get_Adc_Average(V28V2_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v2 <= 0.0)
{
v28v2 = 0.0;
}
break;
}
case V28V1_1_CH:
{
v28v1_1 = (Get_Adc_Average(V28V1_1_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v1_1 <= 0.0)
{
v28v1_1 = 0.0;
}
break;
}
case V28V1_2_CH:
{
v28v1_2 = (Get_Adc_Average(V28V1_2_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v1_2 <= 0.0)
{
v28v1_2 = 0.0;
}
break;
}
case V28V1_3_CH:
{
v28v1_3 = (Get_Adc_Average(V28V1_3_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v1_3 <= 0.0)
{
v28v1_3 = 0.0;
}
break;
}
case V28V1_4_CH:
{
v28v1_4 = (Get_Adc_Average(V28V1_4_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v1_4 <= 0.0)
{
v28v1_4 = 0.0;
}
break;
}
case V28V1_5_CH:
{
v28v1_5 = (Get_Adc_Average(V28V1_5_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v1_5 <= 0.0)
{
v28v1_5 = 0.0;
}
break;
}
case V28V1_6_CH:
{
v28v1_6 = (Get_Adc_Average(V28V1_6_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v1_6 <= 0.0)
{
v28v1_6 = 0.0;
}
break;
}
case V28V2_1_CH:
{
v28v2_1 = (Get_Adc_Average(V28V2_1_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v2_1 <= 0.0)
{
v28v2_1 = 0.0;
}
break;
}
case V28V2_2_CH:
{
v28v2_2 = (Get_Adc_Average(V28V2_2_CH,V_CLOOECT_TIMES) * 4.5 / 4096 * 24.5);
if(v28v2_2 <= 0.0)
{
v28v2_2 = 0.0;
}
break;
}
default:
{
break;
}
}
}
else if(type == I_CLM2543)
{
if(promise_380vin_flag)
{
switch(ch)
{
case I12V_CH:
{
i12v = ((Get_Adc_Average_I(I12V_CH,I_CLOOECT_TIMES) * 4.5 / 4096 - 0.5) / 0.1333);
i12v = i12v*0.9911+0.0588; //数据校准
if(i12v <= 0.0)
{
i12v = 0.0;
}
break;
}
case I28V1_CH:
{
i28v1 = (((Get_Adc_Average_I(I28V1_CH,I_CLOOECT_TIMES) * 4.5 / 4096) - 2.5) * 25.0);
if(i28v1 <= 0.0)
{
i28v1 = 0.0;
}
break;
}
case I28V2_CH:
{
i28v2 = ((Get_Adc_Average_I(I28V2_CH,I_CLOOECT_TIMES) * 4.5 / 4096 - 0.5) / 0.1333);
if(i28v2 <= 0.0)
{
i28v2 = 0.0;
}
break;
}
case I28V1_1_CH:
{
i28v1_1 = ((Get_Adc_Average_I(I28V1_1_CH,I_CLOOECT_TIMES) * 4.5 / 4096 - 0.5) * 5.0);
i28v1_1 = i28v1_1*1.0226+0.0365; //数据校准
if(i28v1_1 <= 0.0)
{
i28v1_1 = 0.0;
}
break;
}
case I28V1_2_CH:
{
i28v1_2 = ((Get_Adc_Average_I(I28V1_2_CH,I_CLOOECT_TIMES) * 4.5 / 4096 - 0.5) * 5.0);
i28v1_2 = i28v1_2*1.0262+0.0358; //数据校准
if(i28v1_2 <= 0.0)
{
i28v1_2 = 0.0;
}
break;
}
case I28V1_3_CH:
{
i28v1_3 = ((Get_Adc_Average_I(I28V1_3_CH,I_CLOOECT_TIMES) * 4.5 / 4096 - 0.5) * 5.0);
i28v1_3 = i28v1_3*1.0081+0.1306; //数据校准
if(i28v1_3 <= 0.0)
{
i28v1_3 = 0.0;
}
break;
}
case I28V1_4_CH:
{
i28v1_4 = ((Get_Adc_Average_I(I28V1_4_CH,I_CLOOECT_TIMES) * 4.5 / 4096 - 0.5) * 5.0);
i28v1_4 = i28v1_4*1.0103+0.1621; //数据校准
if(i28v1_4 <= 0.0)
{
i28v1_4 = 0.0;
}
break;
}
case I28V1_5_CH:
{
i28v1_5 = ((Get_Adc_Average_I(I28V1_5_CH,I_CLOOECT_TIMES) * 4.5 / 4096 - 0.5) * 5.0);
i28v1_5 = i28v1_5*1.002+0.1534; //数据校准
if(i28v1_5 <= 0.0)
{
i28v1_5 = 0.0;
}
break;
}
case I28V1_6_CH:
{
i28v1_6 = ((Get_Adc_Average_I(I28V1_6_CH,I_CLOOECT_TIMES) * 4.5 / 4096 - 0.5) * 5.0);
i28v1_6 = i28v1_6*0.9951+0.1796; //数据校准