[资源分享] 【杰发科技AC7802x测评】之六 项目篇:基于AC7802x的工业级温控系统开发

[复制链接]
 楼主| abner_ma 发表于 2023-7-3 20:32 | 显示全部楼层 |阅读模式
<
本帖最后由 abner_ma 于 2023-7-3 20:40 编辑

     杰发科技AC7802x AEC-Q100 通过车规级Grade 1 qualified -40 to 125°C认证,性能稳定,所以本项目选用车规级医疗级温控系统开发。
    系统组件:
     1,显示屏为3.5英寸LCD显示器;
     2 .多个NTC 10K 热敏电阻传感器,蜂鸣器 ,LED等
     3 ,通讯模块:采用433MHz无线电通讯,CAT1 模组。
     4 单片机系统资源 :ADC ,串口,SPI, 按键中断 后期加入RTOS+LVGL

工作原理:
    水在水箱与制冷系统之间通过一水泵循环;当水温降到设定温度时,设备发出声光信号,操作人员介入,人员做完准备工作后按下“运行开关”;控温原理,设备采用PID控制进行调温,通过温度传感器反馈的信号,对Pvar、Ivar、Dvar(比例、积分、微分)三个参数进行整定与优化,调整水箱水温,以此来实现对目标精确控温,应用领取汽车关键部件制冷,工业激光制冷,医疗级别制冷等。
   驱动TFT LCD:
1.png

LCD接口:先用普通口模拟,发现速度慢,用SPI驱动明显加快!

12.png


22.jpg

先测试个demo:
2.jpg

  1. #include "gpio.h"
  2. #include "timer.h"
  3. #include "lcd_init.h"
  4. #include "lcd.h"
  5. #include "pic.h"

  6. int main(void)
  7. {
  8.         
  9.                 unsigned char  i,j;
  10.                 float t=0;
  11.                 InitDelay();

  12.                 LCD_Init();//LCD³õʼ»¯
  13.                 LCD_Fill(0,0,LCD_W,LCD_H,WHITE);

  14.         while(1)
  15.         {        
  16.                

  17.                 LCD_ShowChinese(20,8,"杰发科技国之骄傲",RED,WHITE,32,0);
  18.                 LCD_ShowString(0,60,"AC7802x Data Sheet:",RED,WHITE,32,0);
  19.                 LCD_ShowString(0,100,"Automotive grade:",RED,WHITE,32,0);
  20.                 LCD_ShowString(0,140," AEC-Q100 Grade 1 ",BLUE,WHITE,32,0);
  21.                 LCD_ShowString(0,180," Qualified",BLUE,WHITE,32,0);
  22.                 LCD_ShowString(0,220," 32 MHz ARM[url=home.php?mod=space&uid=72445]@[/url] ",GREEN,WHITE,32,0);
  23.                 LCD_ShowString(0,260," CortexM0+ core",GREEN,WHITE,32,0);
  24. for(j=0;j<4;j++)
  25.                 {
  26.    for(i=0;i<8;i++)
  27.     {
  28.    LCD_ShowPicture(40*i,300+j*40,40,40,gImage_1);
  29.      }
  30.    }
  31.         }
接口定义:
  1. #ifndef __LCD_INIT_H
  2. #define __LCD_INIT_H

  3. #include "ac780x_gpio.h"
  4. //#include "ac7802x.h"

  5. #define USE_HORIZONTAL 0  //ÉèÖúáÆÁ»òÕßÊúÆÁÏÔʾ 0»ò1ΪÊúÆÁ 2»ò3ΪºáÆÁ
  6. //typedef unsigned int  u32;
  7. //typedef unsigned int  u16;
  8. //typedef unsigned char  u8;
  9. typedef uint32_t u32;
  10. typedef uint16_t u16;
  11. typedef uint8_t u8;
  12. #if USE_HORIZONTAL==0||USE_HORIZONTAL==1
  13. #define LCD_W 320
  14. #define LCD_H 480

  15. #else
  16. #define LCD_W 480
  17. #define LCD_H 320
  18. #endif
  19. #define LCD_SCLK_Clr() GPIO_SetPinLevel(GPIOA, GPIO_PIN0, GPIO_LEVEL_LOW);
  20. #define LCD_SCLK_Set() GPIO_SetPinLevel(GPIOA, GPIO_PIN0, GPIO_LEVEL_HIGH);

  21. #define LCD_MOSI_Clr() GPIO_SetPinLevel(GPIOA, GPIO_PIN1, GPIO_LEVEL_LOW);
  22. #define LCD_MOSI_Set() GPIO_SetPinLevel(GPIOA, GPIO_PIN1, GPIO_LEVEL_HIGH);

  23. #define LCD_RES_Clr()  GPIO_SetPinLevel(GPIOA, GPIO_PIN2, GPIO_LEVEL_LOW);
  24. #define LCD_RES_Set()  GPIO_SetPinLevel(GPIOA, GPIO_PIN2, GPIO_LEVEL_HIGH);
  25. #define LCD_DC_Clr()   GPIO_SetPinLevel(GPIOA, GPIO_PIN3, GPIO_LEVEL_LOW);
  26. #define LCD_DC_Set()   GPIO_SetPinLevel(GPIOA, GPIO_PIN3, GPIO_LEVEL_HIGH);
  27. #define LCD_BLK_Clr()  GPIO_SetPinLevel(GPIOA, GPIO_PIN4, GPIO_LEVEL_LOW);
  28. #define LCD_BLK_Set()  GPIO_SetPinLevel(GPIOA, GPIO_PIN4, GPIO_LEVEL_HIGH);
  29. #define ZK_MISO        GPIO_GetPinLevel(GPIOA,GPIO_PIN5)//MISO  ¶ÁÈ¡×Ö¿âÊý¾ÝÒý½Å
  30. //#define ZK_MISO        GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)//MISO  ¶ÁÈ¡×Ö¿âÊý¾ÝÒý½Å
  31. #define LCD_CS_Clr()   GPIO_SetPinLevel(GPIOA, GPIO_PIN6, GPIO_LEVEL_LOW);
  32. #define LCD_CS_Set()   GPIO_SetPinLevel(GPIOA, GPIO_PIN6, GPIO_LEVEL_HIGH);

  33. #define ZK_CS_Clr()    GPIO_SetPinLevel(GPIOA, GPIO_PIN7, GPIO_LEVEL_LOW);
  34. #define ZK_CS_Set()    GPIO_SetPinLevel(GPIOA, GPIO_PIN7, GPIO_LEVEL_HIGH);
  35. void LCD_GPIO_Init(void);//³õʼ»¯GPIO
  36. void LCD_Writ_Bus(u8 dat);//Ä£ÄâSPIʱÐò
  37. void LCD_WR_DATA8(u8 dat);//дÈëÒ»¸ö×Ö½Ú
  38. void LCD_WR_DATA(u32 dat);//дÈëÈý¸ö×Ö½Ú
  39. void LCD_WR_REG(u8 dat);//дÈëÒ»¸öÖ¸Áî
  40. void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//ÉèÖÃ×ø±êº¯Êý
  41. void LCD_Init(void);//LCD³õʼ»¯
  42. #endif





传感器采用多组热敏传感器 :

3.jpg

多通道 ADC采集热敏传感器数据
666.png

关键算法:
  1. unsigned int code temp_table[]={
  2. 140, //;-40 0
  3. 149, //;-39 1
  4. 159, //;-38 2
  5. 168, //;-37 3
  6. 178, //;-36 4
  7. 188, //;-35 5
  8. 199, //;-34 6
  9. 210, //;-33 7
  10. 222, //;-32 8
  11. 233, //;-31 9
  12. 246, //;-30 10
  13. 259, //;-29 11
  14. 272, //;-28 12
  15. 286, //;-27 13
  16. 301, //;-26 14
  17. 317, //;-25 15
  18. 333, //;-24 16
  19. 349, //;-23 17
  20. 367, //;-22 18
  21. 385, //;-21 19
  22. 403, //;-20 20
  23. 423, //;-19 21
  24. 443, //;-18 22
  25. 464, //;-17 23
  26. 486, //;-16 24
  27. 509, //;-15 25
  28. 533, //;-14 26
  29. 558, //;-13 27
  30. 583, //;-12 28
  31. 610, //;-11 29
  32. 638, //;-10 30
  33. 667, //;-9 31
  34. 696, //;-8 32
  35. 727, //;-7 33
  36. 758, //;-6 34
  37. 791, //;-5 35
  38. 824, //;-4 36
  39. 858, //;-3 37
  40. 893, //;-2 38
  41. 929, //;-1 39
  42. 965, //;0 40
  43. 1003, //;1 41
  44. 1041, //;2 42
  45. 1080, //;3 43
  46. 1119, //;4 44
  47. 1160, //;5 45
  48. 1201, //;6 46
  49. 1243, //;7 47
  50. 1285, //;8 48
  51. 1328, //;9 49
  52. 1371, //;10 50
  53. 1414, //;11 51
  54. 1459, //;12 52
  55. 1503, //;13 53
  56. 1548, //;14 54
  57. 1593, //;15 55
  58. 1638, //;16 56
  59. 1684, //;17 57
  60. 1730, //;18 58
  61. 1775, //;19 59
  62. 1821, //;20 60
  63. 1867, //;21 61
  64. 1912, //;22 62
  65. 1958, //;23 63
  66. 2003, //;24 64
  67. 2048, //;25 65
  68. 2093, //;26 66
  69. 2137, //;27 67
  70. 2182, //;28 68
  71. 2225, //;29 69
  72. 2269, //;30 70
  73. 2312, //;31 71
  74. 2354, //;32 72
  75. 2397, //;33 73
  76. 2438, //;34 74
  77. 2479, //;35 75
  78. 2519, //;36 76
  79. 2559, //;37 77
  80. 2598, //;38 78
  81. 2637, //;39 79
  82. 2675, //;40 80
  83. 2712, //;41 81
  84. 2748, //;42 82
  85. 2784, //;43 83
  86. 2819, //;44 84
  87. 2853, //;45 85
  88. 2887, //;46 86
  89. 2920, //;47 87
  90. 2952, //;48 88
  91. 2984, //;49 89
  92. 3014, //;50 90
  93. 3044, //;51 91
  94. 3073, //;52 92
  95. 3102, //;53 93
  96. 3130, //;54 94
  97. 3157, //;55 95
  98. 3183, //;56 96
  99. 3209, //;57 97
  100. 3234, //;58 98
  101. 3259, //;59 99
  102. 3283, //;60 100
  103. 3306, //;61 101
  104. 3328, //;62 102
  105. 3351, //;63 103
  106. 3372, //;64 104
  107. 3393, //;65 105
  108. 3413, //;66 106
  109. 3432, //;67 107
  110. 3452, //;68 108
  111. 3470, //;69 109
  112. 3488, //;70 110
  113. 3506, //;71 111
  114. 3523, //;72 112
  115. 3539, //;73 113
  116. 3555, //;74 114
  117. 3571, //;75 115
  118. 3586, //;76 116
  119. 3601, //;77 117
  120. 3615, //;78 118
  121. 3628, //;79 119
  122. 3642, //;80 120
  123. 3655, //;81 121
  124. 3667, //;82 122
  125. 3679, //;83 123
  126. 3691, //;84 124
  127. 3702, //;85 125
  128. 3714, //;86 126
  129. 3724, //;87 127
  130. 3735, //;88 128
  131. 3745, //;89 129
  132. 3754, //;90 130
  133. 3764, //;91 131
  134. 3773, //;92 132
  135. 3782, //;93 133
  136. 3791, //;94 134
  137. 3799, //;95 135
  138. 3807, //;96 136
  139. 3815, //;97 137
  140. 3822, //;98 138
  141. 3830, //;99 139
  142. 3837, //;100 140
  143. 3844, //;101 141
  144. 3850, //;102 142
  145. 3857, //;103 143
  146. 3863, //;104 144
  147. 3869, //;105 145
  148. 3875, //;106 146
  149. 3881, //;107 147
  150. 3887, //;108 148
  151. 3892, //;109 149
  152. 3897, //;110 150
  153. 3902, //;111 151
  154. 3907, //;112 152
  155. 3912, //;113 153
  156. 3917, //;114 154
  157. 3921, //;115 155
  158. 3926, //;116 156
  159. 3930, //;117 157
  160. 3934, //;118 158
  161. 3938, //;119 159
  162. 3942 //;120 160
  163. };

  164. #define D_SCALE 10
  165. int get_temperature(uint adc)
  166. {
  167. uint code *p;
  168. uint i;
  169. uchar j,k;
  170. uchar min,max;

  171. // adc = 4096 - adc; //Rt½ÓµØ
  172. p = temp_table;
  173. if(adc < p[0]) return (0xfffe);
  174. if(adc > p[160]) return (0xffff);

  175. min = 0; //-40¶È
  176. max = 160; //120¶È

  177. for(j=0; j<5; j++) //¶Ô·Ö²é±í
  178. {
  179. k = min / 2 + max / 2;
  180. if(adc <= p[k]) max = k;
  181. else min = k;
  182. }
  183. if(adc == p[min]) i = (uint)min * D_SCALE;
  184. else if(adc == p[max]) i = (uint)max * D_SCALE;
  185. else // min < temp < max
  186. {
  187. while(min <= max)
  188. {
  189. min++;
  190. if(adc == p[min]) {i = (uint)min * D_SCALE; break;}
  191. else if(adc < p[min])
  192. {
  193. min--;
  194. i = p[min]; //min
  195. j = (adc - i) * D_SCALE / (p[min+1] - i);
  196. i = min;
  197. i *= D_SCALE;
  198. i += j;
  199. break;
  200. }
  201. }
  202. }
  203. return (i-400);
  204. }








chenqianqian 发表于 2023-7-3 20:52 来自手机 | 显示全部楼层
能通过车规级认证还是不错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

95

主题

181

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部