You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
380 lines
11 KiB
380 lines
11 KiB
////////////////////////////////////////////////////////////////////////////
|
|
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
|
|
///-------------------------------------------------------------------------
|
|
/// @file bsp_drv.c
|
|
/// @brief bsp @ driver config
|
|
///-------------------------------------------------------------------------
|
|
/// @version 1.0
|
|
/// @author CC
|
|
/// @date 20180331
|
|
/// @note cc_AS_stc02
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "asp_schain.h"
|
|
///#include "common.h"
|
|
#include "msp_uart1.h"
|
|
#include "bsp_cs1232.h"
|
|
#include "debug_drv.h"
|
|
|
|
#define D_sensor_up_down 1/// 称重传感器上下镜像选择
|
|
|
|
//=============================================
|
|
///打开adc输出监控,0kg的试试每一路的输出就是 0kg_out1_adc FF77 FFB3 00A4 FFEA
|
|
// #define D_ch1_0kg_out1_adc (vS16)0xFF77
|
|
// #define D_ch2_0kg_out1_adc (vS16)0xFFB3
|
|
// #define D_ch3_0kg_out1_adc (vS16)0x00A4
|
|
// #define D_ch4_0kg_out1_adc (vS16)0xFFEA
|
|
// /////需要通过测试配置 如果不在意符号位 可以优化掉
|
|
// #define D_ch1_out1_offset (vS16)(D_ch1_wantline-D_ch1_0kg_out1_adc)
|
|
// #define D_ch2_out1_offset (vS16)(D_ch2_wantline-D_ch2_0kg_out1_adc)
|
|
// #define D_ch3_out1_offset (vS16)(D_ch3_wantline-D_ch3_0kg_out1_adc)
|
|
// #define D_ch4_out1_offset (vS16)(D_ch4_wantline-D_ch4_0kg_out1_adc)
|
|
|
|
// #define D_ch1_wantline (vS16)0x18da
|
|
// #define D_ch2_wantline (vS16)0x18da
|
|
// #define D_ch3_wantline (vS16)0x18da
|
|
// #define D_ch4_wantline (vS16)0x18da
|
|
|
|
///cc 2023/04/06--7:39:40 每个传感器放置10kg
|
|
///应变片传感器10kg的adc值,选择这个是因为10kg容易获得 并且有一定的重量差
|
|
///这个值需要实验获得
|
|
#define D_ch1_10kg_out1_adc (vS16)0x0584
|
|
#define D_ch2_10kg_out1_adc (vS16)0x05DE
|
|
#define D_ch3_10kg_out1_adc (vS16)0x0731
|
|
#define D_ch4_10kg_out1_adc (vS16)0x066C
|
|
|
|
#define D_Rsensor_per_10kg ((vS16)10)
|
|
#define D_adc_per_kg ((D_ch1_10kg_out1_adc-D_ch1_0kg_out1_adc)/D_Rsensor_per_10kg)
|
|
#define D_adc_zeroout (10*D_adc_per_kg) ///零点都拉到10kg
|
|
|
|
|
|
|
|
|
|
TS_task_adc_sample ts_adc_samples[D_ADC_CHANNEL_NUM];
|
|
|
|
//ch是0123,代表4通道
|
|
void L2_task_adc_init(U8 ch)
|
|
{
|
|
//通道采集任务初始化
|
|
L1_task_reg_clear(&ts_adc_samples[ch].task);
|
|
L3_task_s_go(ts_adc_samples[ch],D_task_init);
|
|
|
|
printf5("\r\n rev **************** wantline %5X\t %X\t %X\t %X\t %X\r\n",TS_adc_SPara[ch].ch,\
|
|
TS_adc_SPara[ch].wantline,TS_adc_SPara[ch].offset,TS_adc_SPara[ch].ashift,TS_adc_SPara[ch].bshift444);
|
|
|
|
ts_adc_samples[ch].pSPara = &TS_adc_SPara[ch];
|
|
ts_adc_samples[ch].firstRun = 1;
|
|
|
|
// printf5("\r\n rev **************** wantline %5X\t %X\t %X\t %X\t %X\r\n",ts_adc_samples[ch].pSPara->ch,\
|
|
// ts_adc_samples[ch].pSPara->wantline,ts_adc_samples[ch].pSPara->offset,ts_adc_samples[ch].pSPara->ashift,ts_adc_samples[ch].pSPara->bshift444);
|
|
|
|
// ts_adc_samples[0].pSPara->wantline = D_ch1_wantline;
|
|
// ts_adc_samples[0].pSPara->offset = D_ch1_out1_offset;
|
|
// ts_adc_samples[0].pSPara->ch = 0;
|
|
// ts_adc_samples[0].pSPara->ashift = 2;
|
|
// ts_adc_samples[0].pSPara->bshift444 = 5;
|
|
|
|
// ts_adc_samples[1].pSPara->wantline = D_ch1_wantline;
|
|
// ts_adc_samples[1].pSPara->offset = D_ch2_out1_offset;
|
|
// ts_adc_samples[1].pSPara->ch = 1;
|
|
// ts_adc_samples[1].pSPara->ashift = 2;
|
|
// ts_adc_samples[1].pSPara->bshift444 = 5;
|
|
|
|
// ts_adc_samples[2].pSPara->wantline = D_ch1_wantline;
|
|
// ts_adc_samples[2].pSPara->offset = D_ch3_out1_offset;
|
|
// ts_adc_samples[2].pSPara->ch = 2;
|
|
// ts_adc_samples[2].pSPara->ashift = 2;
|
|
// ts_adc_samples[2].pSPara->bshift444 = 5;
|
|
|
|
// ts_adc_samples[3].pSPara->wantline = D_ch1_wantline;
|
|
// ts_adc_samples[3].pSPara->offset = D_ch4_out1_offset;
|
|
// ts_adc_samples[3].pSPara->ch = 3;
|
|
// ts_adc_samples[3].pSPara->ashift = 2;
|
|
// ts_adc_samples[3].pSPara->bshift444 = 5;
|
|
|
|
}
|
|
|
|
//ADC Channel 采样任务
|
|
#define D_task_ADC_CHx_SAMPLE_JITTER_START_SAMPLE 0x53
|
|
#define D_task_ADC_CHx_JITTER 0x63
|
|
#define D_task_ADC_CHx_PIANYI 0x93
|
|
#define D_task_ADC_CHx_JITTER2 0x83
|
|
#define D_task_ADC_CHx_despiking_shift 0x94
|
|
#define D_task_ADC_CHx_SAMPLE_WAIT_LOW 0x73
|
|
#define D_task_ADC_CHx_SAMPLE_READ 0x54
|
|
#define D_task_ADC_CHx_SAMPLE_OUT 0x55
|
|
#define D_task_ADC_CHx_SHIFTFILTER 0x56
|
|
#define D_task_ADC_CHx_SHIFTFILTER2 0x57
|
|
#define D_ADC_JITTER_zero 22///还包含建立时间 至少9个
|
|
#define D_ADC_JITTER_FINISH 12///还包含建立时间 至少9个
|
|
|
|
/********
|
|
80hZ
|
|
1000ms/80= 12.5ms/point
|
|
ushex send = 4Bytes+blank = 5Byte;
|
|
115200 0.1ms/Byte
|
|
所以发送5Bytes 消耗0.5ms 发送四列 消耗2ms 系统足够响应
|
|
|
|
*******/
|
|
|
|
|
|
|
|
S16 L3_out_tran(vU32 rdata)
|
|
{
|
|
S16 t16;
|
|
/// 24bits 3Bytes
|
|
rdata >>= 8;
|
|
t16 = rdata;
|
|
|
|
#if (D_sensor_up_down)
|
|
t16 *= -1;
|
|
#else
|
|
///t16 *= -1;
|
|
#endif
|
|
return t16;
|
|
}
|
|
|
|
vU16 L3_adc_out_offset(vU16 offset,vU16 t16)
|
|
{
|
|
vU16 out;
|
|
|
|
/// L0_uart0_ushex(t16); L0_uart0_uc(' ');
|
|
if(t16 & 0x8000) //最高位为1,<0则
|
|
{
|
|
t16 = 0xffFF - t16;///转变为正数
|
|
///*d = D_ADC_OFFSET - t16;
|
|
out = offset - t16;
|
|
// L0_uart0_uc('$'); L0_uart0_ushex(ts_adc_samples[ch].offset);L0_uart0_uc(' ');
|
|
}else
|
|
{
|
|
out = t16 + offset;
|
|
}
|
|
// L0_uart0_ushex(out);L0_uart0_uc(' '); L0_uart0_uc('R');L0_uart0_0d0a();
|
|
return out;
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
adcval adc采样值
|
|
^
|
|
|
|
|
| --.-------------.-------------.------------.---------wantline
|
|
| . . . .
|
|
| . . offset3 .
|
|
| . . . .
|
|
| . . .ch3.adc .
|
|
| offset1 offset2 .
|
|
| . . offset4
|
|
---0---.-------------.--------------------------.------------
|
|
| . .ch2.adc .
|
|
| . .
|
|
| ch1.adc .
|
|
| .
|
|
| ch3.adc.
|
|
|
|
.的数量或高度就是offset
|
|
adc有正数和负数
|
|
|
|
|
|
*/
|
|
vU16 L3_adc_get_offset(vU16 wantline,vU16 adcv)
|
|
{
|
|
vU16 out;
|
|
|
|
/// L0_uart0_ushex(t16); L0_uart0_uc(' ');
|
|
if(adcv & 0x8000) //最高位为1,<0则
|
|
{
|
|
out = 0xffFF - adcv;///转变为正数
|
|
out += wantline;
|
|
}else
|
|
{
|
|
out = wantline - adcv;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
/*
|
|
///cc 2023/04/06--6:34:10
|
|
针对西安方片传感器
|
|
adc
|
|
hex dec kg adc/kg
|
|
68F 1679 10 168
|
|
|
|
4196 16790 100
|
|
-------------void L2_task_adc_sample(TS_TASK_ADC_SAMPLE *s)----------
|
|
|
|
s->out1_adc = L3_out_tran(s->out0);
|
|
############
|
|
|
|
s->out2_offset = L3_out_offset(s->ch,s->out1_adc);
|
|
############
|
|
|
|
Lc_despiking_shift3_U16(s->outm);////采样后进行削峰
|
|
s->out3_peak = s->outm[1];
|
|
############
|
|
|
|
s->ts_SAa.out4_shift = (vU16)s->ts_SAa.average; from s->out3_peak
|
|
|
|
s->ts_SAb.out4_shift = (vU16)s->ts_SAb.average;from s->out3_peak
|
|
|
|
----------void L3_task_weight_handler(TS_TASK_weight_ *s)-----------------
|
|
|
|
|
|
ts_adc_samples[3].out5 = ts_adc_samples[3].ts_SAb.out4_shift;
|
|
|
|
############
|
|
|
|
////四个传感器相加后平均
|
|
tst_weight.sum32 = ts_adc_samples[0].out5;
|
|
tst_weight.sum32 += ts_adc_samples[1].out5;
|
|
tst_weight.sum32 += ts_adc_samples[2].out5;
|
|
tst_weight.sum32 += ts_adc_samples[3].out5;
|
|
|
|
tst_weight.out6 = tst_weight.sum32 >>2;
|
|
############
|
|
tst_weight.adc32 = tst_weight.out6;
|
|
L3_task_weight_cal();
|
|
|
|
上电的时候有几种状态
|
|
1 有人
|
|
2 有物体
|
|
3 无人
|
|
出厂必备的操作,
|
|
1,没有重物清零,数据写入程序,
|
|
出厂把adc的值都偏移到 10kg/200kg 如果时基本时1/20偏移
|
|
也就是出厂时传感器的值基本一条线
|
|
2,以后上电时 或者重新启动时 低于一定重量就清零
|
|
3,手工可以清零
|
|
|
|
|
|
---------------------------
|
|
|
|
四个传感器 在没有重量 出厂的时候需要拉成偏移
|
|
简单的方式 四个传感器累加的模式
|
|
|
|
*/
|
|
|
|
|
|
void L2_task_adc_sample(TS_task_adc_sample *s)
|
|
{
|
|
TTSS_Task_init():
|
|
////cc 初始化尽量放到这里,不要放到main——init中,减少系统启动的时间
|
|
s->jitter_start = 0; s->ok = 0;
|
|
////printf("\r\nADC_SAMPLE\r\n");
|
|
/*
|
|
printf5("\r\nADC_SAMPLE init ch(%d) wantline:%d(%4X) offset %d(%4X)", (int)s->pSPara->ch,
|
|
ts_adc_samples[s->pSPara->ch].pSPara->wantline,ts_adc_samples[s->pSPara->ch].pSPara->wantline,
|
|
ts_adc_samples[s->pSPara->ch].pSPara->offset,ts_adc_samples[s->pSPara->ch].pSPara->offset);
|
|
*/
|
|
|
|
printf1("\r\nADC_SAMPLE init ch(%d)",(int)s->pSPara->ch);
|
|
L1_uartD_waitFree();
|
|
|
|
s->firstRun = 1;
|
|
|
|
/// L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
|
|
L2_task_go_Tdelay(D_task_ADC_CHx_SAMPLE_READ,D_Tdelay_Msec(1500)); //延时15ms
|
|
|
|
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_READ):
|
|
if(0 == L0_adc_DOUT_AT(s->pSPara->ch))
|
|
{////L0_uart0_uc('X');L0_uart0_uc(0x30+s->ch);
|
|
//// L0_ADS1231_readCH2(s->ch,&(s->out1)); ////
|
|
L0_ADS1231_readCH2(s->pSPara->ch,&(s->out0));
|
|
L2_task_go(D_task_ADC_CHx_PIANYI);
|
|
}
|
|
TTSS_Task_step(D_task_ADC_CHx_PIANYI):
|
|
s->out1_adc = L3_out_tran(s->out0);///////cc 2023/04/06--6:33:46 最原始的输出
|
|
s->out2_offset = L3_adc_out_offset(s->pSPara->offset,s->out1_adc);
|
|
L2_task_go(D_task_ADC_CHx_despiking_shift);
|
|
TTSS_Task_step(D_task_ADC_CHx_despiking_shift):
|
|
s->outm[0] = s->outm[1];
|
|
s->outm[1] = s->outm[2];
|
|
s->outm[2] = s->out2_offset;
|
|
|
|
Lc_despiking_shift3_U16(s->outm);////采样后进行削峰
|
|
s->out3_Peak = s->outm[1];
|
|
|
|
/// s->pSPara->offset = s->pSPara->wantline - s->out3_Peak;
|
|
|
|
if(s->firstRun)///
|
|
{////第一次上电
|
|
L2_task_go(D_task_ADC_CHx_JITTER2);
|
|
}else
|
|
{
|
|
L2_task_go(D_task_ADC_CHx_SHIFTFILTER);
|
|
}
|
|
TTSS_Task_step(D_task_ADC_CHx_JITTER2):
|
|
|
|
|
|
if(s->jitter_start < D_ADC_JITTER_FINISH)
|
|
{
|
|
///printfs("\r\n D_ADC_JITTER_zero---");
|
|
L1_uartD_uc('9');
|
|
s->jitter_start ++;
|
|
L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
|
|
}else
|
|
{
|
|
/// 上电的时候如果没有重量可以这样 ,如果有呢??
|
|
///L3_out_zero(s->ch);///算出当前的偏移量 更新offset
|
|
|
|
s->pSPara->offset = L3_adc_get_offset(s->pSPara->wantline,s->out1_adc);///必须out1_adc 因为偏移是针对 out1_adc的
|
|
/// s->pSPara->offset = s->pSPara->wantline - s->out3_Peak;
|
|
|
|
printfs("\r\n D_ADC_JITTER_zero---");
|
|
///printf3("\r\n ch(%d) out3_Peak %5d %5X ",(int)s->pSPara->ch,s->out3_Peak,s->out3_Peak );
|
|
|
|
printf5("\r\n rev(%c) ch(%d) adc=%5d ->offset %5d wantline %5d ",s->pSPara->rev1,(int)s->pSPara->ch,s->out1_adc,s->pSPara->offset,s->pSPara->wantline);
|
|
printf5("\r\n rev(%c) ch(%d) adc=%5X ->offset %5X wantline %5X ",s->pSPara->rev1,(int)s->pSPara->ch,s->out1_adc,s->pSPara->offset,s->pSPara->wantline);
|
|
|
|
s->ts_SAa.average = (vU32)s->out3_Peak;/// shiftaverage_a路初始化
|
|
s->ts_SAa.sum = s->ts_SAa.average << s->pSPara->ashift;
|
|
/**
|
|
s->ts_SAb.average = (vU32)s->out3_Peak;/// shiftaverage_b路初始化
|
|
s->ts_SAb.sum = s->ts_SAb.average << s->pSPara->bshift;
|
|
*/
|
|
|
|
s->firstRun = 0;
|
|
///刚开始的抖动,先去掉几个最开始的数据
|
|
L2_task_go(D_task_ADC_CHx_SHIFTFILTER);
|
|
}
|
|
TTSS_Task_step(D_task_ADC_CHx_SHIFTFILTER):
|
|
//L0_uart0_uc('B');
|
|
s->ts_SAa.sum -= s->ts_SAa.average;
|
|
s->ts_SAa.sum += (vU32)s->out3_Peak;
|
|
s->ts_SAa.average = s->ts_SAa.sum >> s->pSPara->ashift;
|
|
// s->ts_SAa.new = s->ts_SAa.average;
|
|
s->ts_SAa.out4_shift = (vU16)s->ts_SAa.average;
|
|
/// L0_uart0_uc('s');
|
|
|
|
L2_task_go(D_task_ADC_CHx_SHIFTFILTER2);
|
|
TTSS_Task_step(D_task_ADC_CHx_SHIFTFILTER2):
|
|
|
|
|
|
s->ok = 1;
|
|
L2_task_go(D_task_ADC_CHx_SAMPLE_READ);
|
|
|
|
/// L2_task_go(D_task_ADC_CHx_SAMPLE_OUT);
|
|
TTSS_Task_step(D_task_ADC_CHx_SAMPLE_OUT):
|
|
|
|
/***
|
|
L0_uart0_ulhex(s->out0); L0_uart0_uc(0x09);
|
|
L0_uart0_ushex(s->out1); L0_uart0_uc(0x09);
|
|
L0_uart0_ushex(s->out2); L0_uart0_uc(0x09);
|
|
L0_uart0_ushex(s->ts_SAa.out4); L0_uart0_uc(0x09);
|
|
L0_uart0_ushex(s->ts_SAb.out4);
|
|
L0_uart0_0d0a();
|
|
|
|
|
|
**/
|
|
|
|
////
|
|
//// L0_uart0_uc('0' + s->ch);L0_uart0_uc('A');//
|
|
TTSS_Task_end();
|
|
}
|
|
|
|
#if 0
|
|
|
|
#endif
|
|
|
|
|
|
|