ADS1110Setup.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /*--------------------------------------------------------------------------------------
  2. * @file ADS1110Setup.c
  3. * @author ZhangJing
  4. * @version base on stm32f0x
  5. * @date 2015.09.11
  6. * @brief ADS1110驱动
  7. ---------------------------------------------------------------------------------------*/
  8. #include <string.h>
  9. #include "stm32f10x_gpio.h"
  10. #include "TypeDefine.h"
  11. #include "IICSetup.h"
  12. #include "ADS1110ASetup.h"
  13. #include "ADS1110Setup.h"
  14. #include "SystemAlarm.h"
  15. uint16_t pressureFZero = 1097; //压力采集值零点值
  16. uint16_t pressureFZero2 = 466; //压力2采集值零点值
  17. uint16_t pressureCounts = 0; //压力采集次数
  18. //uint16_t pressureF1[102]={ 0 }; //压力采集值数组,采集数据做滤波用
  19. uint16_t pressureF1[400]={ 0 }; //压力采集值数组,采集数据做滤波用
  20. uint16_t PressureF1_bf[10]={ 0 }; //压力备份数据数组
  21. uint16_t PressureF1_bf2[10]={ 0 }; //压力备份数据数组
  22. uint8_t Pressurebf_Cont=0; //压力备份次数
  23. uint16_t average_Pressure=0; //压力平均值
  24. uint16_t average_Pressure_bf=0; //压力平均值
  25. uint16_t self_adaption_Pressure=0; //自适应压力值
  26. uint16_t self_adaption_buf[5]={0}; //自适应压力值缓冲区
  27. uint8_t self_adaption_cont=0; //自适应压力值缓冲区储存次数
  28. uint8_t self_adaption_flag=0; //自适应压力参数处理完成标志,用于后面压力报警判断
  29. uint16_t ces_cong=0;
  30. uint16_t tempPressure = 0;
  31. uint16_t tempPressure_2 = 0;
  32. uint8_t ces_flag1=0;
  33. //--------------外部变量声明---------------------
  34. extern uint8_t self_adaption_Alarmcont; //自适应压力报警判断次数
  35. /*************************************************************************************
  36. * Function: ADS1110Config
  37. * Object: 配置ADS1110
  38. * 输入: 无
  39. * 输出: 无
  40. * 备注: 1、通过模拟IIC与ADS1110通信,进行初始化配置
  41. * 2、uint8_t tempState = 0;临时变量
  42. **************************************************************************************/
  43. void ADS1110Config(void)
  44. {
  45. uint8_t tempState = 0;
  46. TWI_START();
  47. tempState = TWI_SendByte(ADS1110_WR_ADDRESS);
  48. if( 1 != tempState )
  49. {
  50. //发送终止IIC标志
  51. TWI_STOP();
  52. return;
  53. }
  54. TWI_SendNACK();
  55. tempState = TWI_SendByte(ADS1110_CONFIG_REG);
  56. if( 1 != tempState )
  57. {
  58. //发送终止IIC标志
  59. TWI_STOP();
  60. return;
  61. }
  62. TWI_SendNACK();
  63. TWI_STOP();
  64. }
  65. /*************************************************************************************
  66. * Function: RD_ADS
  67. * Object: 读ADS1110数据
  68. * 输入: 无
  69. * 输出: 转换后数据
  70. * 备注: 1、将读取回来的数据,通过uint16_t W_B1byte_high, W_B1byte_low, W_B1_word;
  71. * 这些变量进行计算,并返回转换后的电压值
  72. **************************************************************************************/
  73. uint16_t RD_ADS(void)
  74. {
  75. // u8 temp;
  76. uint16_t W_B1byte_high, W_B1byte_low, W_B1_word;
  77. TWI_START();
  78. TWI_SendByte(ADS1110_RD_ADDRESS);//0x90
  79. TWI_SendNACK();
  80. //
  81. // if(!temp)
  82. // {
  83. W_B1byte_high /*= TMR_H*/ = TWI_ReceiveByte();
  84. TWI_SendACK();
  85. W_B1byte_low /*= TMR_L*/ = TWI_ReceiveByte();
  86. TWI_SendACK();
  87. W_B1_word = TWI_ReceiveByte();
  88. TWI_STOP();
  89. W_B1_word = ((W_B1byte_high << 8)+ W_B1byte_low);
  90. // if (W_B1_word > 0x7fff)
  91. // W_B1_word = 0;
  92. return W_B1_word;
  93. // }
  94. // else
  95. // return 0x0000;
  96. }
  97. /*************************************************************************************
  98. * Function: ContactForceUpdate
  99. * Object: 读取触力传感器的值
  100. * 输入: 无
  101. * 输出: 无
  102. * 备注: 1、根据TaskSchedulerFlag.sensorPWPressureFlag标志位来判断是否需要采集压力值
  103. * 2、根据TaskSchedulerFlag.forceConvertFlag标志位来判断是启动转换还是读取AD采集的值
  104. * 3、float tempPressure = 0;临时变量,做压力计算
  105. * 4、压力值必须先启动转换再进行读取
  106. * 5、压力值读取完成进行大小排序,取最大值作为本次采集值
  107. **************************************************************************************/
  108. void ContactForceUpdate( void )
  109. {
  110. //float tempPressure = 0;
  111. uint16_t i,j;
  112. tempPressure=0;
  113. tempPressure_2=0;
  114. if( TaskSchedulerFlag.sensorPWPressureFlag == TASK_FLAG_SET )
  115. {
  116. if( TaskSchedulerFlag.forceConvertFlag == TASK_FLAG_CLEAR )//启动转换
  117. {
  118. ADS1110Config();
  119. //ADS1110AConfig();
  120. TaskSchedulerFlag.forceConvertFlag = TASK_FLAG_WAIT;
  121. }
  122. else if( TaskSchedulerFlag.forceConvertFlag == TASK_FLAG_SET )//读取压力值
  123. {
  124. //读取A/D压力采集值
  125. tempPressure_2 = RD_ADS();
  126. TaskSchedulerFlag.forceConvertFlag = TASK_FLAG_CLEAR;
  127. if( tempPressure_2 > 80 )
  128. {
  129. ces_flag1=1;
  130. return;
  131. }
  132. else
  133. {
  134. pressureF1[pressureCounts] = (uint16_t)tempPressure_2;
  135. pressureCounts++;
  136. }
  137. /* tempPressure *= 9.8;//算出压力值 F=mg g=9.8N/Kg
  138. tempPressure = tempPressure / 9.68;
  139. realTimeData.pressure = tempPressure;//压强值*/
  140. /* tempPressure = RD2_ADS();
  141. //如果采集值小于零点值,则将新采集的值作为零点值
  142. if( ( tempPressure < pressureFZero2 ) && ( tempPressure > 400) )
  143. {
  144. pressureFZero2 = tempPressure;
  145. }
  146. if( tempPressure > 400 )//零点值不会小于400,如果没有压力传感器则会在400以下
  147. {
  148. tempPressure -= pressureFZero2;//采集值-零点值=压力值
  149. }
  150. else
  151. {
  152. tempPressure = 0;
  153. }
  154. realTimeData.pressureF2 = tempPressure;
  155. tempPressure *= 9.8;//算出压力值 F=mg g=9.8N/Kg
  156. tempPressure = tempPressure / 9.68;
  157. realTimeData.pressure2 = tempPressure;*/
  158. //TaskSchedulerFlag.forceConvertFlag = TASK_FLAG_CLEAR;
  159. //if( pressureF1[pressureCounts] > 9999 )
  160. /*if( pressureF1[pressureCounts] > 80 )//2017.3.22修改压力最大值为80
  161. {
  162. pressureF1[pressureCounts] = 0;
  163. return ;
  164. }*/
  165. //
  166. }
  167. }
  168. else
  169. {
  170. if(( pressureCounts != 0 ) || (ces_flag1 == 1))//只要采集值不为零说明刚有采集值就做比较
  171. {
  172. //报警判断相关结构赋值
  173. ces_flag1=0;
  174. SysAlarmJudge.JamFaultJudgeFlag = TASK_FLAG_SET;
  175. //SysAlarmJudge.BubbleFaultJudgeFlag = TASK_FLAG_SET;
  176. SysAlarmJudge.NonePillCaseJudgeFlag = TASK_FLAG_SET;
  177. //TaskSchedulerFlag.testDispFlag = TASK_FLAG_SET;
  178. for( i = 1; i < pressureCounts; i++ )
  179. {
  180. tempPressure = pressureF1[i];
  181. for( j = 0; j < ( pressureCounts + 1 - i ); j++ )
  182. {
  183. if( pressureF1[j] > pressureF1[j + 1] )
  184. {
  185. tempPressure = pressureF1[j];
  186. pressureF1[j] = pressureF1[j + 1];
  187. pressureF1[j + 1] = tempPressure;
  188. }
  189. }
  190. }
  191. // if( pressureCounts >28 )//只要采集值不为零说明刚有采集值就做比较
  192. {
  193. realTimeData.pressureF = pressureF1[pressureCounts - 1];//取最大值
  194. }
  195. if( realTimeData.pressureF > 80 )
  196. {
  197. realTimeData.pressureF = 0;
  198. }
  199. (void) memset (&pressureF1, 0, sizeof(pressureF1)); //将pressureF1数据清零
  200. ces_cong=pressureCounts;
  201. pressureCounts = 0;
  202. //***********************求自适应的压力参数****************************
  203. if( start_flag ==1) //连续取值五次,求最大值
  204. {
  205. uint16_t t=0;
  206. self_adaption_buf[self_adaption_cont] = realTimeData.pressureF;
  207. // if(self_adaption_Pressure < realTimeData.pressureF)
  208. // self_adaption_Pressure = realTimeData.pressureF;
  209. self_adaption_cont++;
  210. if( self_adaption_cont > 4)
  211. {
  212. for(j=1;j<5;j++) //升序排列 滤波去掉最大值
  213. {
  214. for(i=0;i<5-j;i++)
  215. {
  216. if(self_adaption_buf[i] > self_adaption_buf[i+1])
  217. {
  218. t=self_adaption_buf[i+1];
  219. self_adaption_buf[i+1] = self_adaption_buf[i];
  220. self_adaption_buf[i] = t;
  221. }
  222. }
  223. }
  224. self_adaption_Pressure = self_adaption_buf[3];
  225. self_adaption_cont=0;
  226. start_flag=0;
  227. self_adaption_flag=1; //自适应压力参数处理完成标志,用于后面压力报警判断
  228. self_adaption_Alarmcont=0;
  229. }
  230. }
  231. //********************************************************************
  232. /* //-----------对于堵塞报警,算法改为:每十个周期,去掉一个最小值,一个最大值,求平均值,20170506
  233. if(Pressurebf_Cont<10)
  234. {
  235. PressureF1_bf[Pressurebf_Cont] = realTimeData.pressureF;
  236. Pressurebf_Cont++;
  237. }
  238. else
  239. {
  240. uint8_t t=0,i=0,j=0,k=0,w=0,z=0,x=0;
  241. for(x=0;x<10;x++)
  242. {
  243. PressureF1_bf2[x] = PressureF1_bf[x]; //把记录的十组数据备份,为后面回复数据做准备
  244. }
  245. for(j=1;j<10;j++) //升序排列
  246. {
  247. for(i=0;i<10-j;i++)
  248. {
  249. if(PressureF1_bf[i] > PressureF1_bf[i+1])
  250. {
  251. t=PressureF1_bf[i+1];
  252. PressureF1_bf[i+1] = PressureF1_bf[i];
  253. PressureF1_bf[i] = t;
  254. }
  255. }
  256. }
  257. average_Pressure=0; //求平均值前清零
  258. for(k=1;k<9;k++)//求平均值
  259. {
  260. average_Pressure += PressureF1_bf[k];
  261. }
  262. average_Pressure_bf = ((average_Pressure*5)/4);//(average_Pressure*10/8);参数放大10倍
  263. for(z=0;z<10;z++)
  264. {
  265. PressureF1_bf[z] = PressureF1_bf2[z]; //把原始数据还原,为下次采集数据移除数据做准备
  266. }
  267. for(w=0;w<9;w++)//向低位移位一位
  268. {
  269. PressureF1_bf[w]=PressureF1_bf[w+1];
  270. }
  271. Pressurebf_Cont=9;//排序完成,清除采集备份次数
  272. }
  273. //-----------------------------------------------------------------------*/
  274. }
  275. }
  276. }