C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 1 C51 COMPILER V9.54, COMPILATION OF MODULE ASP_SCHAIN OBJECT MODULE PLACED IN ..\out\asp_schain.obj COMPILER INVOKED BY: E:\KeilC51\C51\BIN\C51.EXE ..\source\asp\asp_schain.c LARGE OMF2 OPTIMIZE(0,SIZE) BROWSE ORDER NOIN -TPROMOTE INCDIR(..\source\bsp;..\source\msp;..\source\app;..\source\clib;..\source\cpu;..\source\ctask;..\source\tpc;..\ -source\asp;..\source\debug;..\source\msp\uart;..\source\msp\simiic;..\source\bsp\oled;..\source\bsp\TTSSbsp) DEBUG PRINT -(..\out\asp_schain.lst) TABS(2) OBJECT(..\out\asp_schain.obj) line level source 1 //////////////////////////////////////////////////////////////////////////// 2 ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. 3 ///------------------------------------------------------------------------- 4 /// @file bsp_drv.c 5 /// @brief bsp @ driver config 6 ///------------------------------------------------------------------------- 7 /// @version 1.0 8 /// @author CC 9 /// @date 20180331 10 /// @note cc_AS_stc02 11 ////////////////////////////////////////////////////////////////////////////// 12 13 #include "asp_schain.h" *** WARNING C320 IN LINE 51 OF ..\source\bsp\TTSSbsp\bsp_config.h: "MainFre_22M" 14 ///#include "common.h" 15 #include "msp_uart1.h" 16 #include "bsp_cs1232.h" 17 #include "debug_drv.h" 18 19 #define D_sensor_up_down 1/// 称重传感器上下镜像选择 20 21 //============================================= 22 ///打开adc输出监控,0kg的试试每一路的输出就是 0kg_out1_adc FF77 FFB3 00A4 FFEA 23 #define D_ch1_0kg_out1_adc (vS16)0xFF77 24 #define D_ch2_0kg_out1_adc (vS16)0xFFB3 25 #define D_ch3_0kg_out1_adc (vS16)0x00A4 26 #define D_ch4_0kg_out1_adc (vS16)0xFFEA 27 /////需要通过测试配置 如果不在意符号位 可以优化 diao 28 #define D_ch1_out1_offset (vS16)(D_ch1_wantline-D_ch1_0kg_out1_adc) 29 #define D_ch2_out1_offset (vS16)(D_ch2_wantline-D_ch2_0kg_out1_adc) 30 #define D_ch3_out1_offset (vS16)(D_ch3_wantline-D_ch3_0kg_out1_adc) 31 #define D_ch4_out1_offset (vS16)(D_ch4_wantline-D_ch4_0kg_out1_adc) 32 33 #define D_ch1_wantline (vS16)0x18da 34 #define D_ch2_wantline (vS16)0x18da 35 #define D_ch3_wantline (vS16)0x18da 36 #define D_ch4_wantline (vS16)0x18da 37 38 ///cc 2023/04/06--7:39:40 每个传感器放置10kg 39 ///应变片传感器10kg的adc值,选择这个是因为10kg容易获得 并且有一定的重量差 40 ///这个值需要实验获得 41 #define D_ch1_10kg_out1_adc (vS16)0x0584 42 #define D_ch2_10kg_out1_adc (vS16)0x05DE 43 #define D_ch3_10kg_out1_adc (vS16)0x0731 44 #define D_ch4_10kg_out1_adc (vS16)0x066C 45 46 #define D_Rsensor_per_10kg ((vS16)10) 47 #define D_adc_per_kg ((D_ch1_10kg_out1_adc-D_ch1_0kg_out1_adc)/D_Rsensor_per_10kg) 48 #define D_adc_zeroout (10*D_adc_per_kg) ///零点都拉到10kg 49 50 TS_adc_SPara_ TS_adc_SPara[D_ADC_CHANNEL_NUM]= 51 { C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 2 52 53 'A',//0 1 u8 rev1; 54 0,//2 3 u8 ch; 55 D_ch1_wantline,///vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力 -时想要输出的adc的值 56 D_ch1_out1_offset,//3 4 vU16 offset; 57 2,//4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16 58 5,//5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16 59 60 'A',//0 1 u8 rev1; 61 1,//2 3 u8 ch; 62 D_ch1_wantline,///vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力 -时想要输出的adc的值 63 D_ch2_out1_offset,//3 4 vU16 offset; 64 2,//4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16 65 5,//5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16 66 67 'A',//0 1 u8 rev1; 68 2,//2 3 u8 ch; 69 D_ch1_wantline,///vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力 -时想要输出的adc的值 70 D_ch3_out1_offset,//3 4 vU16 offset; 71 2,//4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16 72 5,//5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16 73 74 75 'A',//0 1 u8 rev1; 76 3,//2 3 u8 ch; 77 D_ch1_wantline,///vU16 wantline; ///固定的硬件参数(例如称重中的0kg,压力中的0压力 -时想要输出的adc的值 78 D_ch4_out1_offset,//3 4 vU16 offset; 79 2,//4 5 vU8 ashift; ///移动的位数 1-2 2-4 3-8 4-16 80 5//5 6 vU8 bshift; ///移动的位数 1-2 2-4 3-8 4-16 81 82 83 }; 84 85 86 TS_task_adc_sample ts_adc_samples[D_ADC_CHANNEL_NUM]; 87 88 //ch是0123,代表4通道 89 void L2_task_adc_init(U8 ch) 90 { 91 1 //通道采集任务初始化 92 1 L1_task_reg_clear(&ts_adc_samples[ch].task); 93 1 L3_task_s_go(ts_adc_samples[ch],D_task_init); 94 1 95 1 96 1 ts_adc_samples[ch].pSPara = &TS_adc_SPara[ch]; 97 1 ts_adc_samples[ch].firstRun = 1; 98 1 99 1 100 1 } 101 102 //ADC Channel 采样任务 103 #define D_task_ADC_CHx_SAMPLE_JITTER_START_SAMPLE 0x53 104 #define D_task_ADC_CHx_JITTER 0x63 105 #define D_task_ADC_CHx_PIANYI 0x93 106 #define D_task_ADC_CHx_JITTER2 0x83 107 #define D_task_ADC_CHx_despiking_shift 0x94 108 #define D_task_ADC_CHx_SAMPLE_WAIT_LOW 0x73 109 #define D_task_ADC_CHx_SAMPLE_READ 0x54 C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 3 110 #define D_task_ADC_CHx_SAMPLE_OUT 0x55 111 #define D_task_ADC_CHx_SHIFTFILTER 0x56 112 #define D_task_ADC_CHx_SHIFTFILTER2 0x57 113 #define D_ADC_JITTER_zero 22///还包含建立时间 至少9个 114 #define D_ADC_JITTER_FINISH 12///还包含建立时间 至少9个 115 116 /******** 117 80hZ 118 1000ms/80= 12.5ms/point 119 ushex send = 4Bytes+blank = 5Byte; 120 115200 0.1ms/Byte 121 所以发送5Bytes 消耗0.5ms 发送四列 消耗2ms 系统足够响应 122 123 *******/ 124 125 126 127 S16 L3_out_tran(vU32 rdata) 128 { 129 1 S16 t16; 130 1 /// 24bits 3Bytes 131 1 rdata >>= 8; 132 1 t16 = rdata; 133 1 134 1 #if (D_sensor_up_down) 135 1 t16 *= -1; 136 1 #else ///t16 *= -1; #endif 139 1 return t16; 140 1 } 141 142 vU16 L3_adc_out_offset(vU16 offset,vU16 t16) 143 { 144 1 vU16 out; 145 1 146 1 /// L0_uart0_ushex(t16); L0_uart0_uc(' '); 147 1 if(t16 & 0x8000) //最高位为1,<0则 148 1 { 149 2 t16 = 0xffFF - t16;///转变为正数 150 2 ///*d = D_ADC_OFFSET - t16; 151 2 out = offset - t16; 152 2 // L0_uart0_uc('$'); L0_uart0_ushex(ts_adc_samples[ch].offset);L0_uart0_uc(' '); 153 2 }else 154 1 { 155 2 out = t16 + offset; 156 2 } 157 1 // L0_uart0_ushex(out);L0_uart0_uc(' '); L0_uart0_uc('R');L0_uart0_0d0a(); 158 1 return out; 159 1 } 160 161 162 /* 163 164 adcval adc采样值 165 ^ 166 | 167 | --.-------------.-------------.------------.---------wantline 168 | . . . . 169 | . . offset3 . 170 | . . . . 171 | . . .ch3.adc . C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 4 172 | offset1 offset2 . 173 | . . offset4 174 ---0---.-------------.--------------------------.------------ 175 | . .ch2.adc . 176 | . . 177 | ch1.adc . 178 | . 179 | ch3.adc. 180 181 .的数量或高度就是offset 182 adc有正数和负数 183 184 185 */ 186 vU16 L3_adc_get_offset(vU16 wantline,vU16 adcv) 187 { 188 1 vU16 out; 189 1 190 1 /// L0_uart0_ushex(t16); L0_uart0_uc(' '); 191 1 if(adcv & 0x8000) //最高位为1,<0则 192 1 { 193 2 out = 0xffFF - adcv;///转变为正数 194 2 out += wantline; 195 2 }else 196 1 { 197 2 out = wantline - adcv; 198 2 } 199 1 return out; 200 1 } 201 202 /* 203 ///cc 2023/04/06--6:34:10 204 针对西安方片传感器 205 adc 206 hex dec kg adc/kg 207 68F 1679 10 168 208 209 4196 16790 100 210 -------------void L2_task_adc_sample(TS_TASK_ADC_SAMPLE *s)---------- 211 212 s->out1_adc = L3_out_tran(s->out0); 213 ############ 214 215 s->out2_offset = L3_out_offset(s->ch,s->out1_adc); 216 ############ 217 218 Lc_despiking_shift3_U16(s->outm);////采样后进行削峰 219 s->out3_peak = s->outm[1]; 220 ############ 221 222 s->ts_SAa.out4_shift = (vU16)s->ts_SAa.average; from s->out3_peak 223 224 s->ts_SAb.out4_shift = (vU16)s->ts_SAb.average;from s->out3_peak 225 226 ----------void L3_task_weight_handler(TS_TASK_weight_ *s)----------------- 227 228 229 ts_adc_samples[3].out5 = ts_adc_samples[3].ts_SAb.out4_shift; 230 231 ############ 232 233 ////四个传感器相加后平均 C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 5 234 tst_weight.sum32 = ts_adc_samples[0].out5; 235 tst_weight.sum32 += ts_adc_samples[1].out5; 236 tst_weight.sum32 += ts_adc_samples[2].out5; 237 tst_weight.sum32 += ts_adc_samples[3].out5; 238 239 tst_weight.out6 = tst_weight.sum32 >>2; 240 ############ 241 tst_weight.adc32 = tst_weight.out6; 242 L3_task_weight_cal(); 243 244 上电的时候有几种状态 245 1 有人 246 2 有物体 247 3 无人 248 出厂必备的操作, 249 1,没有重物清零,数据写入程序, 250 出厂把adc的值都偏移到 10kg/200kg 如果时基本时1/20偏移 251 也就是出厂时传感器的值基本一条线 252 2,以后上电时 或者重新启动时 低于一定重量就清零 253 3,手工可以清零 254 255 256 --------------------------- 257 258 四个传感器 在没有重量 出厂的时候需要拉成偏移 259 简单的方式 四个传感器累加的模式 260 261 */ 262 263 264 void L2_task_adc_sample(TS_task_adc_sample *s) 265 { 266 1 TTSS_Task_init(): 267 2 ////cc 初始化尽量放到这里,不要放到main ——init中,减少系统启动的时间 268 2 s->jitter_start = 0; s->ok = 0; 269 2 ////printf("\r\nADC_SAMPLE\r\n"); 270 2 /* 271 2 printf5("\r\nADC_SAMPLE init ch(%d) wantline:%d(%4X) offset %d(%4X)", (int)s->pSPara->ch, 272 2 ts_adc_samples[s->pSPara->ch].pSPara->wantline,ts_adc_samples[s->pSPara->ch].pSPara->wantline, 273 2 ts_adc_samples[s->pSPara->ch].pSPara->offset,ts_adc_samples[s->pSPara->ch].pSPara->offset); 274 2 */ 275 2 276 2 printf1("\r\nADC_SAMPLE init ch(%d) ", (int)s->pSPara->ch); 277 2 L1_uartD_waitFree() ; 278 2 279 2 s->firstRun = 1; 280 2 281 2 /// L2_task_go(D_task_ADC_CHx_SAMPLE_READ); 282 2 L2_task_go_Tdelay(D_task_ADC_CHx_SAMPLE_READ,D_Tdelay_Msec(1500)); //延时15ms 283 2 284 2 TTSS_Task_step(D_task_ADC_CHx_SAMPLE_READ): 285 2 if(0 == L0_adc_DOUT_AT(s->pSPara->ch)) 286 2 {////L0_uart0_uc('X');L0_uart0_uc(0x30+s->ch); 287 3 //// L0_ADS1231_readCH2(s->ch,&(s->out1)); //// 288 3 L0_ADS1231_readCH2(s->pSPara->ch,&(s->out0)); 289 3 L2_task_go(D_task_ADC_CHx_PIANYI); 290 3 } 291 2 TTSS_Task_step(D_task_ADC_CHx_PIANYI): 292 2 s->out1_adc = L3_out_tran(s->out0);///////cc 2023/04/06--6:33:46 最原始的输出 293 2 s->out2_offset = L3_adc_out_offset(s->pSPara->offset,s->out1_adc); 294 2 L2_task_go(D_task_ADC_CHx_despiking_shift); 295 2 TTSS_Task_step(D_task_ADC_CHx_despiking_shift): C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 6 296 2 s->outm[0] = s->outm[1]; 297 2 s->outm[1] = s->outm[2]; 298 2 s->outm[2] = s->out2_offset; 299 2 300 2 Lc_despiking_shift3_U16(s->outm);////采样后进行削峰 301 2 s->out3_Peak = s->outm[1]; 302 2 303 2 /// s->pSPara->offset = s->pSPara->wantline - s->out3_Peak; 304 2 305 2 if(s->firstRun)/// 306 2 {////第一次上电 307 3 L2_task_go(D_task_ADC_CHx_JITTER2); 308 3 }else 309 2 { 310 3 L2_task_go(D_task_ADC_CHx_SHIFTFILTER); 311 3 } 312 2 TTSS_Task_step(D_task_ADC_CHx_JITTER2): 313 2 314 2 315 2 if(s->jitter_start < D_ADC_JITTER_FINISH) 316 2 { 317 3 ///printfs("\r\n D_ADC_JITTER_zero---"); 318 3 L1_uartD_uc('9'); 319 3 s->jitter_start ++; 320 3 L2_task_go(D_task_ADC_CHx_SAMPLE_READ); 321 3 }else 322 2 { 323 3 /// 上电的时候如果没有重量可以这样 ,如果有呢?? 324 3 ///L3_out_zero(s->ch);///算出当前的偏移量 更新offset 325 3 326 3 s->pSPara->offset = L3_adc_get_offset(s->pSPara->wantline,s->out1_adc);///必须out1_adc 因为偏移 -针对 out1_adc的 327 3 /// s->pSPara->offset = s->pSPara->wantline - s->out3_Peak; 328 3 329 3 printfs("\r\n D_ADC_JITTER_zero---"); 330 3 ///printf3("\r\n ch(%d) out3_Peak %5d %5X ",(int)s->pSPara->ch,s->out3_Peak,s->out3_Peak ); 331 3 332 3 printf4("\r\n ch(%d) adc=%5d ->offset %5d wantline %5d ",(int)s->pSPara->ch,s->out1_adc,s->pSPara->offs -et,s->pSPara->wantline); 333 3 printf4("\r\n ch(%d) adc=%5X ->offset %5X wantline %5X ",(int)s->pSPara->ch,s->out1_adc,s->pSPara->offs -et,s->pSPara->wantline); 334 3 335 3 s->ts_SAa.average = (vU32)s->out3_Peak;/// shiftaverage_a路初始化 336 3 s->ts_SAa.sum = s->ts_SAa.average << s->pSPara->ashift; 337 3 /** 338 3 s->ts_SAb.average = (vU32)s->out3_Peak;/// shiftaverage_b路初始化 339 3 s->ts_SAb.sum = s->ts_SAb.average << s->pSPara->bshift; 340 3 */ 341 3 342 3 s->firstRun = 0; 343 3 ///刚开始的抖动,先去掉几个最开始的数据 344 3 L2_task_go(D_task_ADC_CHx_SHIFTFILTER); 345 3 } 346 2 TTSS_Task_step(D_task_ADC_CHx_SHIFTFILTER): 347 2 //L0_uart0_uc('B'); 348 2 s->ts_SAa.sum -= s->ts_SAa.average; 349 2 s->ts_SAa.sum += (vU32)s->out3_Peak; 350 2 s->ts_SAa.average = s->ts_SAa.sum >> s->pSPara->ashift; 351 2 // s->ts_SAa.new = s->ts_SAa.average; 352 2 s->ts_SAa.out4_shift = (vU16)s->ts_SAa.average; 353 2 /// L0_uart0_uc('s'); 354 2 C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 7 355 2 L2_task_go(D_task_ADC_CHx_SHIFTFILTER2); 356 2 TTSS_Task_step(D_task_ADC_CHx_SHIFTFILTER2): 357 2 358 2 359 2 s->ok = 1; 360 2 L2_task_go(D_task_ADC_CHx_SAMPLE_READ); 361 2 362 2 /// L2_task_go(D_task_ADC_CHx_SAMPLE_OUT); 363 2 TTSS_Task_step(D_task_ADC_CHx_SAMPLE_OUT): 364 2 365 2 /*** 366 2 L0_uart0_ulhex(s->out0); L0_uart0_uc(0x09); 367 2 L0_uart0_ushex(s->out1); L0_uart0_uc(0x09); 368 2 L0_uart0_ushex(s->out2); L0_uart0_uc(0x09); 369 2 L0_uart0_ushex(s->ts_SAa.out4); L0_uart0_uc(0x09); 370 2 L0_uart0_ushex(s->ts_SAb.out4); 371 2 L0_uart0_0d0a(); 372 2 373 2 374 2 **/ 375 2 376 2 //// 377 2 //// L0_uart0_uc('0' + s->ch);L0_uart0_uc('A');// 378 2 TTSS_Task_end(); 379 1 } 380 381 #if 0 void L3_out_zero(u8 ch) { vS16 t,m; t = ts_adc_samples[ch].out1_adc; m = ts_adc_samples[ch].SPara.wantline; m -= t; ts_adc_samples[ch].SPara.offset = (vU16)m; /// L0_waitFree_uartN(0);///混搭使用printf的时候必须加上 /// printf("\r\nzeroout = %4x offset= 0x%4x\r\n", ts_adc_samples[ch].zeroout,ts_adc_samples[ch].offset); /// D_ADC_OFFSET(ch) = ts_adc_samples[ch].zeroout - ts_adc_samples[ch].out1; } vU16 L3_out_offset222(u8 ch,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 = ts_adc_samples[ch].SPara.offset - t16; // L0_uart0_uc('$'); L0_uart0_ushex(ts_adc_samples[ch].offset);L0_uart0_uc(' '); }else { out = t16 + ts_adc_samples[ch].SPara.offset; } // L0_uart0_ushex(out);L0_uart0_uc(' '); L0_uart0_uc('R');L0_uart0_0d0a(); return out; } C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 8 vU16 L3_out_tran2(vU32 rdata) { vU16 t16; //// L0_ADS1231_readCH2(0,&rdata); // L0_uart0_uc('0'+ch); L0_uart0_uc(0x09); // L0_uart0_ulhex(rdata); L0_uart0_uc(0x09); if (rdata > 0x007fFFff) { rdata >>= D_sensor_zoom; ///fixme:此处正负差和移位不一致需要谨慎 rdata |= D_sensor_zoom_FF; /// 1111 1100 }else { rdata >>= D_sensor_zoom; } // L0_uart0_ulhex(rdata); L0_uart0_uc(0x09); t16 = rdata; // L0_uart0_ushex(t16); L0_uart0_uc(0x09); ///L0_uart0_0d0a(); return t16; } void L3_task_show_init(void) { //显示任务初始化 L1_task_init(&ts_adc_blur_show.task); L3_task_s_go(ts_adc_blur_show,D_task_init); ts_adc_blur_show.rough_weight = 0; } //中值滤波任务 #define D_task_ADC_CHx_FILTER_MID_GET 0x50 #define D_task_ADC_CHx_FILTER_MID_COUNT 0x51 #define D_task_ADC_CHx_FILTER_MID_OUT 0x52 void L3_task_adc_filter_mid(S_TASK_ADC_BLUR_MID *s) { TTSS_Task_init() L2_task_go(D_task_ADC_CHx_FILTER_MID_GET); TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_GET) if(ts_adc_channel_samples[s->ch].n >= s->max) { U8 i = 0; for(i=0;imax;i++) { s->in[i] = ts_adc_channel_samples[s->ch].out1[i]; } ts_adc_channel_samples[s->ch].n = 0; L2_task_go(D_task_ADC_CHx_FILTER_MID_COUNT); } TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_COUNT) s->midval = Lc_S32_media(s->in, s->max); L2_task_go(D_task_ADC_CHx_FILTER_MID_OUT); TTSS_Task_step(D_task_ADC_CHx_FILTER_MID_OUT) s->out[s->n] = s->midval; //R.adval[s->ch] = s->out[s->n]; s->n++; if(s->n >= MAX_OUT_NUM) { C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 9 s->n = 0; } L2_task_go(D_task_ADC_CHx_FILTER_MID_GET); TTSS_Task_end(); } //均值滤波任务 #define D_task_ADC_CHx_FILTER_AVG_GET 0x50 #define D_task_ADC_CHx_FILTER_AVG_COUNT 0x51 #define D_task_ADC_CHx_FILTER_AVG_OUT 0x52 void L3_task_adc_filter_avg(S_TASK_ADC_BLUR_AVG *s) { TTSS_Task_init() L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET); TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_GET) if(ts_adc_channel_samples[s->ch].n >= s->max) { U8 i = 0; ts_adc_channel_samples[s->ch].n = 0; for(i=0;imax;i++) { s->in[i] = ts_adc_channel_samples[s->ch].out1[i]; } L2_task_go(D_task_ADC_CHx_FILTER_AVG_COUNT); } TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_COUNT) s->avgval = Lc_vS32_avg(s->in,s->max); L2_task_go(D_task_ADC_CHx_FILTER_AVG_OUT); TTSS_Task_step(D_task_ADC_CHx_FILTER_AVG_OUT) s->out[s->n] = s->avgval; //R.adval[s->ch] = s->out[s->n]; s->n++; if(s->n >= MAX_OUT_NUM) { s->n = 0; } L2_task_go(D_task_ADC_CHx_FILTER_AVG_GET); TTSS_Task_end(); } //移位滤波任务 #define D_task_ADC_CHx_FILTER_SHIFT_GET 0x50 #define D_task_ADC_CHx_FILTER_SHIFT_COUNT 0x51 #define D_task_ADC_CHx_FILTER_SHIFT_OUT 0x52 void L3_task_adc_ShiftFilter(TS_TASK_ADC_SHIFTFILTER *s) { TTSS_Task_init() s->average = ts_adc_samples[s->ch].out2;/// s->sum = s->average << s->shift; L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET); TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_GET) C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 10 s->sum += TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_COUNT) s->sum[0] -= s->shiftval[0]; s->sum[0] += s->in; s->shiftval[0] = s->sum[0] >> s->shiftreg[0]; s->sum[1] -= s->shiftval[1]; s->sum[1] += s->in; s->shiftval[1] = s->sum[1] >> s->shiftreg[1]; s->sum[2] -= s->shiftval[2]; s->sum[2] += s->in; s->shiftval[2] = s->sum[2] >> s->shiftreg[2]; L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_OUT); TTSS_Task_step(D_task_ADC_CHx_FILTER_SHIFT_OUT) s->out[0][s->n] = s->shiftval[0]; s->out[1][s->n] = s->shiftval[1]; s->out[2][s->n] = s->shiftval[2]; //R.adval[s->ch] = s->out[0][s->n] = s->shiftval[0]; s->n++; if(s->n >= MAX_OUT_NUM) { s->n = 0; } L2_task_go(D_task_ADC_CHx_FILTER_SHIFT_GET); TTSS_Task_end(); } //输出判定任务 #define D_task_ADC_CHx_FILTER_OUT_GET 0x50 #define D_task_ADC_CHx_FILTER_OUT_COUNT 0x51 #define D_task_ADC_CHx_FILTER_OUT_CHANGE 0x52 #define D_task_ADC_CHx_FILTER_OUT_OUT 0x53 void L3_task_adc_filter_out(S_TASK_ADC_BLUR_OUT *s) { TTSS_Task_init() L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET); TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_GET) if(s->h != ts_adc_blur_shift[s->ch].n) { s->h = ts_adc_blur_shift[s->ch].n; s->in[0] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 1)]; s->in[1] = ts_adc_blur_avg[s->ch].out[count_n(ts_adc_blur_avg[s->ch].n, 2)]; //获取输出曲线val s->newout = ts_adc_blur_shift[s->ch].out[s->oldnum][count_n(ts_adc_blur_shift[s->ch].n, 1)]; L2_task_go(D_task_ADC_CHx_FILTER_OUT_COUNT); } TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_COUNT) //根据阀值选择输出的曲线 //判断选择新曲线 if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[0])//2KG { s->newnum = 0; } else if(Lc_abs(s->in[0] , s->in[1]) >= s->threshold[1]) //0.5KG C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 11 { s->newnum = 1; } else { s->newnum = 2; } //L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT); L2_task_go(D_task_ADC_CHx_FILTER_OUT_CHANGE); TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_CHANGE) if(s->newnum != s->oldnum)//切换移位滤波时调整其他滤波的SUM { s->oldnum = s->newnum; //不能只调整新值,所有曲线都要一起调整 //ts_adc_blur_shift[s->ch].sum[1] = (ts_adc_blur_avg[s->ch].out[ts_adc_blur_avg[s->ch].n] * R.adc_blur_ -avg); ts_adc_blur_shift[s->ch].sum[0] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[0]; ts_adc_blur_shift[s->ch].shiftval[0] = s->newout; ts_adc_blur_shift[s->ch].sum[1] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[1]; ts_adc_blur_shift[s->ch].shiftval[1] = s->newout; ts_adc_blur_shift[s->ch].sum[2] = s->newout << ts_adc_blur_shift[s->ch].shiftreg[2]; ts_adc_blur_shift[s->ch].shiftval[2] = s->newout; } L2_task_go(D_task_ADC_CHx_FILTER_OUT_OUT); TTSS_Task_step(D_task_ADC_CHx_FILTER_OUT_OUT) R.adval[s->ch] = s->newout; //R.adval[s->ch] = ts_adc_channel_samples[s->ch].adcval; L2_task_go(D_task_ADC_CHx_FILTER_OUT_GET); TTSS_Task_end(); } //显示任务 #define D_task_ADC_CHx_SHOW 0x50 void L3_task_adc_filter_show(S_TASK_ADC_BLUR_SHOW *s) { TTSS_Task_init() L2_task_go(D_task_ADC_CHx_SHOW); TTSS_Task_step(D_task_ADC_CHx_SHOW) R.ch_weight[0] = D_COUNT_WEIGHT(R.adval[0]); R.ch_weight[1] = D_COUNT_WEIGHT(R.adval[1]); R.ch_weight[2] = D_COUNT_WEIGHT(R.adval[2]); R.ch_weight[3] = D_COUNT_WEIGHT(R.adval[3]); s->rough_weight = R.ch_weight[0] + R.ch_weight[1] + R.ch_weight[2] + R.ch_weight[3]; //毛重 #if 0 L0_uart0_ulhex(s->rough_weight); L0_uart0_uc(' '); #endif if( ABS(R.rough_weight,s->rough_weight) >= 50) //变化超过0.05KG { R.rough_weight = s->rough_weight; R.total_weight = (R.rough_weight > R.total_zweight) ? (R.rough_weight - R.total_zweight) : (0);//净重 } L2_task_go_Tdelay(D_task_ADC_CHx_SHOW,D_Tdelay_Msec(15)); //延时15ms TTSS_Task_end(); } C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 12 /******* ts_adc_channel_samples[ch].status = (R.p.adc_ch_status >> ch) & 0x1; ts_adc_channel_samples[ch].pool = 0; ts_adc_channel_samples[ch].adcval = 0; ts_adc_channel_samples[ch].n = 0; ts_adc_channel_samples[ch].ch = D_ADCCH_1 + ch; //通道中值滤波任务初始化 L1_task_init(&ts_adc_blur_mid[ch].task); L3_task_s_go(ts_adc_blur_mid[ch],D_task_init); ts_adc_blur_mid[ch].n = 0; ts_adc_blur_mid[ch].max = R.p.adc_blur_mid; ts_adc_blur_mid[ch].ch = D_ADCCH_1 + ch; //通道均值滤波任务初始化 L1_task_init(&ts_adc_blur_avg[ch].task); L3_task_s_go(ts_adc_blur_avg[ch],D_task_init); ts_adc_blur_avg[ch].max = R.p.adc_blur_avg; ts_adc_blur_avg[ch].avgval = 0; ts_adc_blur_avg[ch].n = 0; ts_adc_blur_avg[ch].ch = D_ADCCH_1 + ch; //通道移位滤波任务初始化 L1_task_init(&ts_adc_blur_shift[ch].task); L3_task_s_go(ts_adc_blur_shift[ch],D_task_init); ts_adc_blur_shift[ch].n = 0; ts_adc_blur_shift[ch].h = 0; ts_adc_blur_shift[ch].shiftreg[0] = R.p.adc_blur_shift[0]; ts_adc_blur_shift[ch].shiftreg[1] = R.p.adc_blur_shift[1]; ts_adc_blur_shift[ch].shiftreg[2] = R.p.adc_blur_shift[2]; ts_adc_blur_shift[ch].sum[0] = 0; ts_adc_blur_shift[ch].sum[1] = 0; ts_adc_blur_shift[ch].sum[2] = 0; ts_adc_blur_shift[ch].shiftval[0] = 0; ts_adc_blur_shift[ch].shiftval[1] = 0; ts_adc_blur_shift[ch].shiftval[2] = 0; ts_adc_blur_shift[ch].ch = D_ADCCH_1 + ch; //输出判定任务初始化 L1_task_init(&ts_adc_blur_out[ch].task); L3_task_s_go(ts_adc_blur_out[ch],D_task_init); ts_adc_blur_out[ch].h= 0; ts_adc_blur_out[ch].threshold[0] = D_blur_threshold_2_1(R.p.adc_blur_threshold[0]); //2KG ts_adc_blur_out[ch].threshold[1] = D_blur_threshold_2_1(R.p.adc_blur_threshold[1]); //0.5KG ts_adc_blur_out[ch].newnum = 0; ts_adc_blur_out[ch].oldnum = 0; ts_adc_blur_out[ch].oldout = 0; ts_adc_blur_out[ch].newout = 0; ts_adc_blur_out[ch].n = 0; ts_adc_blur_out[ch].ch = D_ADCCH_1 + ch; *****/ #if 0 //通道切换任务初始化 //L1_task_init(&ts_adc_channel_switch.task); L3_task_s_go(ts_adc_channel_switch,D_task_init); #endif #endif 725 C51 COMPILER V9.54 ASP_SCHAIN 09/06/2024 11:24:45 PAGE 13 726 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 2151 ---- CONSTANT SIZE = 142 ---- XDATA SIZE = 238 ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- ---- EDATA SIZE = ---- ---- HDATA SIZE = ---- ---- XDATA CONST SIZE = ---- ---- FAR CONST SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)