van_BSP_Com_Pwm.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /******************************************************************************
  2. *Copyright(C),2024-2024,万众一芯生
  3. *van_BSP_Com_Pwm.c
  4. *stm32 pwm控制的
  5. *修改历史
  6. author 范义东 新建 2024/01/27
  7. ******************************************************************************/
  8. #include "onechip_include_header.h"
  9. #include "van_BSP_Com_Pwm.h"
  10. VAN_COM_PWM_Def gcom_pwm_MINI_V2_V1[] = {
  11. {MINI7_SUB_FUN_MOTOR, NAME(MOTOR), PWM_BUMP_ST_IDLE, COM_PWM_8870, (void *)&htim3, TIM_CHANNEL_2},
  12. {MINI7_SUB_FUN_HEATER1, NAME(HEATER1), PWM_BUMP_ST_IDLE, COM_PWM_8870, (void *)&htim3, TIM_CHANNEL_1},
  13. {MINI7_SUB_FUN_HEATER2, NAME(HEATER2), PWM_BUMP_ST_IDLE, COM_PWM_8870, (void *)&htim1, TIM_CHANNEL_3}
  14. };
  15. unsigned int gcom_pwm_MINI_V2_Num = ARR_LEN(gcom_pwm_MINI_V2_V1);
  16. P_VAN_COM_PWM_Def gcom_pwm_V1;
  17. unsigned int gcom_pwm_V1_Num;
  18. /****************************************************************
  19. 函数名: loadPidCfg
  20. 创建时间: 2024/01/08
  21. 创建人: 范义东
  22. 函数说明:加载配置文件
  23. 参数:
  24. 返回值 : 加载成功
  25. ****************************************************************/
  26. unsigned int load_com_pwm_Cfg(pDeviceBasicInfdef pDevice) {
  27. gcom_pwm_V1 = gcom_pwm_MINI_V2_V1;
  28. gcom_pwm_V1_Num = gcom_pwm_MINI_V2_Num;
  29. P_VAN_COM_PWM_Def pdev = gcom_pwm_V1;
  30. for (int i = 0; i < gcom_pwm_V1_Num; i++) {
  31. pdev++;
  32. }
  33. return true;
  34. }
  35. /****************************************************************
  36. * 函数名: com_pwm_FindChanle
  37. * 创建时间: 2024/01/08
  38. * 创建人: 范义东
  39. * 函数说明:通过ID,查找PWM模块
  40. * 输入参数: devId
  41. * 输出参数: pdev 比例阀配置
  42. * 返回值 : 有配置文件返回true,返回失败
  43. ****************************************************************/
  44. bool com_pwm_FindChanle(unsigned int devId, P_VAN_COM_PWM_Def *pdev) {
  45. unsigned char id;
  46. /*寻找配置文件*/
  47. for (id = 0; id < gcom_pwm_V1_Num; id++) {
  48. if (devId == gcom_pwm_V1[id].ID) {
  49. *pdev = &gcom_pwm_V1[id];
  50. return true;
  51. }
  52. }
  53. Van_Device_Printf(VAN_LOG_NOTICE, "pwm devId:%d no exit\r\n", devId);
  54. *pdev = NULL;
  55. return false;
  56. }
  57. /****************************************************************
  58. 函数名: com_pwm_Getconter
  59. 创建时间: 2024/01/08
  60. 创建人: 范义东
  61. 函数说明:获取当前脉冲计算器
  62. 参数: devId 通道
  63. value pwm值,负值为反向
  64. 返回值 : 加载成功
  65. ****************************************************************/
  66. unsigned int com_pwm_Getconter(unsigned int devId) {
  67. P_VAN_COM_PWM_Def pdev;
  68. if (com_pwm_FindChanle(devId, &pdev)) {
  69. Van_Device_Printf(VAN_LOG_DEBUG, "time:%d conter:%d\n", devId, pdev->feedbackconter);
  70. return pdev->feedbackconter;
  71. } else {
  72. Van_Device_Printf(VAN_LOG_ERROR, "pwn %d not support:%d\n", devId);
  73. }
  74. return 0;
  75. }
  76. /****************************************************************
  77. * 函数名: com_pwm_test
  78. * 创建时间: 2024/01/08
  79. * 创建人: 范义东
  80. * 函数说明:设置PWM输出
  81. * 输入参数: runMtsId 通道
  82. * 输出参数: pTemp 当前温度
  83. * 返回值 : 成功rue,失败返回false
  84. ****************************************************************/
  85. bool com_pwm_test(unsigned int Id, int value) {
  86. P_VAN_COM_PWM_Def pdev;
  87. float fvalue = value;
  88. if (com_pwm_FindChanle(Id, &pdev)) {
  89. com_pwm_Set(Id, fvalue);
  90. Van_Device_Printf(VAN_LOG_NOTICE, "%s: ID:%d set out:%f\r\n", pdev->Name, Id, fvalue);
  91. } else {
  92. Van_Device_Printf(VAN_LOG_NOTICE, "no support ID:%d\r\n", Id);
  93. }
  94. return False;
  95. }
  96. /****************************************************************
  97. 函数名: com_pwm_Set
  98. 创建时间: 2024/01/08
  99. 创建人: 范义东
  100. 函数说明:设置pwm
  101. 参数: devId 通道
  102. value pwm值,负值为反向
  103. 返回值 : 加载成功
  104. ****************************************************************/
  105. void com_pwm_Set(unsigned int devId, float value) {
  106. P_VAN_COM_PWM_Def pdev;
  107. float temp = value;
  108. int DutyCycle = (int)temp;
  109. DutyCycle *= 10;
  110. if (DutyCycle > MAX_PWM_VALUE) {
  111. DutyCycle = MAX_PWM_VALUE;
  112. }else if(DutyCycle < -MAX_PWM_VALUE) {
  113. DutyCycle = -MAX_PWM_VALUE;
  114. }
  115. if (com_pwm_FindChanle(devId, &pdev)) {
  116. // // Van_Device_Printf(VAN_LOG_NOTICE, "before pwn %s pluse:%d\n", pdev->Name, DutyCycle);
  117. // if (pdev->dirPort && (pdev->type == COM_PWM_8870 || pdev->type == COM_PWM_8873)) {
  118. // GPIO_PinState PinState = ((DutyCycle < 0) ^ (pdev->dirState == GPIO_PIN_SET))?GPIO_PIN_SET:GPIO_PIN_RESET;
  119. // HAL_GPIO_WritePin(pdev->dirPort, pdev->dirPin, PinState);
  120. // if (DutyCycle < 0 && pdev->type == COM_PWM_8870) {
  121. // DutyCycle = MAX_PWM_VALUE+DutyCycle;
  122. // }
  123. // if (DutyCycle < 0 && pdev->type == COM_PWM_8873) {
  124. // DutyCycle = -DutyCycle;
  125. // }
  126. // }
  127. if (DutyCycle < 0) {
  128. DutyCycle = 0;
  129. } else if (DutyCycle > MAX_PWM_VALUE) {
  130. DutyCycle = MAX_PWM_VALUE;
  131. }
  132. TIM_HandleTypeDef *ptimer = pdev->timerHandle;
  133. __HAL_TIM_SET_COMPARE(ptimer, pdev->pwmChanle, DutyCycle);
  134. pdev->state = PWM_BUMP_ST_RUN;
  135. } else {
  136. Van_Device_Printf(VAN_LOG_ERROR, "pwn %d not support:%d\n", devId);
  137. }
  138. }
  139. /****************************************************************
  140. * 函数名: showIVT
  141. * 创建时间: 2024/01/08
  142. * 创建人: 范义东
  143. * 函数说明:IVT模块查看
  144. * 输入参数: 无
  145. * 输出参数: 无
  146. * 返回值 : 无
  147. ****************************************************************/
  148. void show_com_pwm(void) {
  149. P_VAN_COM_PWM_Def pdev;
  150. char TimeName[16] = {0};
  151. char FeedTimeCName[16] = {0};
  152. char DirPortName[16] = {0};
  153. Van_Device_Printf(VAN_LOG_NOTICE, "devtype:%d strtype:%d hdtype:%d PWM Num:%d\r\n", sysinf.devdesc.deveice_type, sysinf.devdesc.structure_type,
  154. sysinf.devdesc.hardware_type, gcom_pwm_V1_Num);
  155. if (gcom_pwm_V1_Num == 0) {
  156. Van_Device_Printf(VAN_LOG_NOTICE, "***************no Pwm***************\r\n");
  157. }
  158. Van_Device_Printf(VAN_LOG_NOTICE, "%2s %16s %2s %2s %6s %2s %6s %2s %4s %6s %2s %4s\r\n ", " ID ", " name ", "St", "Type", "tim ", "ch ", "ftim", "fch",
  159. "con ", "Dport", "pin", "value");
  160. HAL_Delay(10);
  161. pdev = gcom_pwm_V1;
  162. for (int i = 0; i < gcom_pwm_V1_Num; i++) {
  163. find_stm32_Peripherals(pdev->timerHandle, TimeName);
  164. find_stm32_Peripherals(pdev->feedbackTimer, FeedTimeCName);
  165. find_stm32_Peripherals(pdev->dirPort, DirPortName);
  166. Van_Device_Printf(VAN_LOG_NOTICE, "%2d %16s %2d %2x %6s %2x %6s %2d %4d %6s %2x %4d\r\n", pdev->ID, pdev->Name, pdev->state, pdev->type, TimeName,
  167. pdev->pwmChanle, FeedTimeCName, pdev->feedbackChanlen, pdev->feedbackconter, DirPortName, pdev->dirPin, pdev->setValue);
  168. HAL_Delay(10);
  169. pdev++;
  170. }
  171. return;
  172. }
  173. /****************************************************************
  174. * 函数名: PWM_Find_By_CHl
  175. * 创建时间: 2024/01/08
  176. * 创建人: 范义东
  177. * 函数说明:通过ID,查找反馈模块
  178. * 输入参数: devId
  179. * 输出参数: pdev 比例阀配置
  180. * 返回值 : 有配置文件返回true,返回失败
  181. ****************************************************************/
  182. bool PWM_Find_feed_By_ch(unsigned int devId, P_VAN_COM_PWM_Def *pdev) {
  183. unsigned char id;
  184. /*寻找配置文件*/
  185. for (id = 0; id < gcom_pwm_V1_Num; id++) {
  186. if (devId == gcom_pwm_V1[id].ID || gcom_pwm_V1[id].feedbackChanlen) {
  187. *pdev = &gcom_pwm_V1[id];
  188. return true;
  189. }
  190. }
  191. Van_Device_Printf(VAN_LOG_NOTICE, "pwm feed devId:%d no exit\r\n", devId);
  192. *pdev = NULL;
  193. return false;
  194. }
  195. /****************************************************************
  196. * 函数名: com_feed_Add_Pulse
  197. * 创建时间: 2024/01/08
  198. * 创建人: 范义东
  199. * 函数说明:通过GPIO_Pin,跟新转到脉冲计数
  200. * 输入参数: devId
  201. * 输出参数: pdev 比例阀配置
  202. * 返回值 : 有配置文件返回true,返回失败
  203. ****************************************************************/
  204. void com_feed_Add_Pulse(uint16_t GPIO_Pin) {
  205. P_VAN_COM_PWM_Def pdev = gcom_pwm_V1;
  206. for (int i = 0; i < gcom_pwm_V1_Num; i++) {
  207. if (pdev->state == PWM_BUMP_ST_RUN && pdev->feedbackChanlen == GPIO_Pin) {
  208. pdev->plusconter++;
  209. // Van_Device_Printf(VAN_LOG_NOTICE, "ID:%d plus:%d\n",pdev->ID,pdev->plusconter);
  210. }
  211. pdev++;
  212. }
  213. }
  214. /****************************************************************
  215. * 函数名: check_Pwm_Plus_feedOK
  216. * 创建时间: 2024/01/08
  217. * 创建人: 范义东
  218. * 函数说明:通过plusconter,检查是否转到
  219. * 输入参数: 无
  220. * 输出参数: 无
  221. * 返回值 : 有配置文件返回true,返回失败
  222. ****************************************************************/
  223. void check_Pwm_Plus_feedOK(void) {
  224. P_VAN_COM_PWM_Def pdev = gcom_pwm_V1;
  225. for (int i = 0; i < gcom_pwm_V1_Num; i++) {
  226. if (pdev->state == PWM_BUMP_ST_RUN && pdev->feedbackChanlen != VAN_CONFIG_NOCARE) {
  227. pdev->plusconter = 0;
  228. }
  229. pdev++;
  230. }
  231. }
  232. /**********************************************************************************
  233. Func Name: Paltform_Set_PWM_Pause
  234. Descriptions: 平台设置暂停PWM
  235. Input para: 无
  236. In&Out Para: 无
  237. Output para: 无
  238. Return value: 无
  239. ***********************************************************************************/
  240. void Paltform_Set_PWM_Pause(unsigned int id) {
  241. P_VAN_COM_PWM_Def dev;
  242. // float goal = 0; /*安1000配置占空比*/
  243. if (com_pwm_FindChanle(id, &dev) == True) {
  244. com_pwm_Set(id, 0);
  245. dev->state = PWM_BUMP_ST_IDLE;
  246. }
  247. }
  248. /**********************************************************************************
  249. Func Name: Paltform_Set_PWM_Resume
  250. Descriptions: 平台设置恢复PWM
  251. Input para: 无
  252. In&Out Para: 无
  253. Output para: 无
  254. Return value: 无
  255. ***********************************************************************************/
  256. void Paltform_Set_PWM_Resume(unsigned int id) {
  257. P_VAN_COM_PWM_Def dev;
  258. if (com_pwm_FindChanle(id, &dev) == True) {
  259. com_pwm_Set(id, dev->setValue);
  260. dev->state = PWM_BUMP_ST_RUN;
  261. }
  262. }