//////////////////////////////////////////////////////////////////////////// ///@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_adc_SPara_ TS_adc_SPara[D_ADC_CHANNEL_NUM]= { 'A', //0 1 u8 rev1; 0, //2 3 u8 ch; D_ch1_wantline, //vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值 D_ch1_out1_offset, //3 4 vU16 offset; 2, //4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16 5, //5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16 'A', //0 1 u8 rev1; 1, //2 3 u8 ch; D_ch1_wantline, //vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值 D_ch2_out1_offset, //3 4 vU16 offset; 2, //4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16 5, //5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16 'A', //0 1 u8 rev1; 2, //2 3 u8 ch; D_ch1_wantline, //vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值 D_ch3_out1_offset, //3 4 vU16 offset; 2, //4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16 5, //5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16 'A', //0 1 u8 rev1; 3, //2 3 u8 ch; D_ch1_wantline, //vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力)时想要输出的adc的值 D_ch4_out1_offset, //3 4 vU16 offset; 2, //4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16 5 //5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16 }; 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); ts_adc_samples[ch].pSPara = &TS_adc_SPara[ch]; ts_adc_samples[ch].firstRun = 1; } //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 ); printf4("\r\n ch(%d) adc=%5d ->offset %5d wantline %5d ",(int)s->pSPara->ch,s->out1_adc,s->pSPara->offset,s->pSPara->wantline); printf4("\r\n ch(%d) adc=%5X ->offset %5X wantline %5X ",(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