van_BSP_Com_Pwm.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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_Set
  59. 创建时间: 2024/01/08
  60. 创建人: 范义东
  61. 函数说明:设置pwm
  62. 参数: devId 通道
  63. value pwm值,负值为反向
  64. 返回值 : 加载成功
  65. ****************************************************************/
  66. void com_pwm_Set(unsigned int devId, float value) {
  67. P_VAN_COM_PWM_Def pdev;
  68. // value ;
  69. int DutyCycle = value;
  70. if (DutyCycle > MAX_PWM_VALUE) {
  71. DutyCycle = MAX_PWM_VALUE;
  72. }else if(DutyCycle < -MAX_PWM_VALUE) {
  73. DutyCycle = -MAX_PWM_VALUE;
  74. }
  75. if (com_pwm_FindChanle(devId, &pdev)) {
  76. // Van_Device_Printf(VAN_LOG_NOTICE, "before pwn %s pluse:%d\n", pdev->Name, DutyCycle);
  77. if (pdev->dirPort && (pdev->type == COM_PWM_8870 || pdev->type == COM_PWM_8873)) {
  78. GPIO_PinState PinState = ((DutyCycle < 0) ^ (pdev->dirState == GPIO_PIN_SET))?GPIO_PIN_SET:GPIO_PIN_RESET;
  79. HAL_GPIO_WritePin(pdev->dirPort, pdev->dirPin, PinState);
  80. if (DutyCycle < 0 && pdev->type == COM_PWM_8870) {
  81. DutyCycle = MAX_PWM_VALUE+DutyCycle;
  82. }
  83. if (DutyCycle < 0 && pdev->type == COM_PWM_8873) {
  84. DutyCycle = -DutyCycle;
  85. }
  86. }
  87. if (DutyCycle < 0) {
  88. DutyCycle = 0;
  89. } else if (DutyCycle > MAX_PWM_VALUE) {
  90. DutyCycle = MAX_PWM_VALUE;
  91. }
  92. __HAL_TIM_SET_COMPARE((TIM_HandleTypeDef *)pdev->timerHandle, pdev->pwmChanle, DutyCycle);
  93. pdev->state = PWM_BUMP_ST_RUN;
  94. // Van_Device_Printf(VAN_LOG_NOTICE, "pwn %s pluse:%d\n", pdev->Name, DutyCycle);
  95. } else {
  96. Van_Device_Printf(VAN_LOG_ERROR, "pwn %d not support:%d\n", devId);
  97. }
  98. }
  99. /****************************************************************
  100. 函数名: com_pwm_Getconter
  101. 创建时间: 2024/01/08
  102. 创建人: 范义东
  103. 函数说明:获取当前脉冲计算器
  104. 参数: devId 通道
  105. value pwm值,负值为反向
  106. 返回值 : 加载成功
  107. ****************************************************************/
  108. unsigned int com_pwm_Getconter(unsigned int devId) {
  109. P_VAN_COM_PWM_Def pdev;
  110. if (com_pwm_FindChanle(devId, &pdev)) {
  111. Van_Device_Printf(VAN_LOG_DEBUG, "time:%d conter:%d\n", devId, pdev->feedbackconter);
  112. return pdev->feedbackconter;
  113. } else {
  114. Van_Device_Printf(VAN_LOG_ERROR, "pwn %d not support:%d\n", devId);
  115. }
  116. return 0;
  117. }
  118. /****************************************************************
  119. * 函数名: com_pwm_test
  120. * 创建时间: 2024/01/08
  121. * 创建人: 范义东
  122. * 函数说明:设置PWM输出
  123. * 输入参数: runMtsId 通道
  124. * 输出参数: pTemp 当前温度
  125. * 返回值 : 成功rue,失败返回false
  126. ****************************************************************/
  127. bool com_pwm_test(unsigned int Id, int value) {
  128. P_VAN_COM_PWM_Def pdev;
  129. float fvalue = value;
  130. if (com_pwm_FindChanle(Id, &pdev)) {
  131. com_pwm_Set(Id, fvalue);
  132. Van_Device_Printf(VAN_LOG_NOTICE, "%s: ID:%d set out:%f\r\n", pdev->Name, Id, fvalue);
  133. } else {
  134. Van_Device_Printf(VAN_LOG_NOTICE, "no support ID:%d\r\n", Id);
  135. }
  136. return False;
  137. }
  138. /****************************************************************
  139. * 函数名: showIVT
  140. * 创建时间: 2024/01/08
  141. * 创建人: 范义东
  142. * 函数说明:IVT模块查看
  143. * 输入参数: 无
  144. * 输出参数: 无
  145. * 返回值 : 无
  146. ****************************************************************/
  147. void show_com_pwm(void) {
  148. P_VAN_COM_PWM_Def pdev;
  149. char TimeName[16] = {0};
  150. char FeedTimeCName[16] = {0};
  151. char DirPortName[16] = {0};
  152. 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,
  153. sysinf.devdesc.hardware_type, gcom_pwm_V1_Num);
  154. if (gcom_pwm_V1_Num == 0) {
  155. Van_Device_Printf(VAN_LOG_NOTICE, "***************no Pwm***************\r\n");
  156. }
  157. 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",
  158. "con ", "Dport", "pin", "value");
  159. HAL_Delay(10);
  160. pdev = gcom_pwm_V1;
  161. for (int i = 0; i < gcom_pwm_V1_Num; i++) {
  162. find_stm32_Peripherals(pdev->timerHandle, TimeName);
  163. find_stm32_Peripherals(pdev->feedbackTimer, FeedTimeCName);
  164. find_stm32_Peripherals(pdev->dirPort, DirPortName);
  165. 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,
  166. pdev->pwmChanle, FeedTimeCName, pdev->feedbackChanlen, pdev->feedbackconter, DirPortName, pdev->dirPin, pdev->setValue);
  167. HAL_Delay(10);
  168. pdev++;
  169. }
  170. return;
  171. }
  172. /****************************************************************
  173. * 函数名: PWM_Find_By_CHl
  174. * 创建时间: 2024/01/08
  175. * 创建人: 范义东
  176. * 函数说明:通过ID,查找反馈模块
  177. * 输入参数: devId
  178. * 输出参数: pdev 比例阀配置
  179. * 返回值 : 有配置文件返回true,返回失败
  180. ****************************************************************/
  181. bool PWM_Find_feed_By_ch(unsigned int devId, P_VAN_COM_PWM_Def *pdev) {
  182. unsigned char id;
  183. /*寻找配置文件*/
  184. for (id = 0; id < gcom_pwm_V1_Num; id++) {
  185. if (devId == gcom_pwm_V1[id].ID || gcom_pwm_V1[id].feedbackChanlen) {
  186. *pdev = &gcom_pwm_V1[id];
  187. return true;
  188. }
  189. }
  190. Van_Device_Printf(VAN_LOG_NOTICE, "pwm feed devId:%d no exit\r\n", devId);
  191. *pdev = NULL;
  192. return false;
  193. }
  194. /****************************************************************
  195. * 函数名: com_feed_Add_Pulse
  196. * 创建时间: 2024/01/08
  197. * 创建人: 范义东
  198. * 函数说明:通过GPIO_Pin,跟新转到脉冲计数
  199. * 输入参数: devId
  200. * 输出参数: pdev 比例阀配置
  201. * 返回值 : 有配置文件返回true,返回失败
  202. ****************************************************************/
  203. void com_feed_Add_Pulse(uint16_t GPIO_Pin) {
  204. P_VAN_COM_PWM_Def pdev = gcom_pwm_V1;
  205. for (int i = 0; i < gcom_pwm_V1_Num; i++) {
  206. if (pdev->state == PWM_BUMP_ST_RUN && pdev->feedbackChanlen == GPIO_Pin) {
  207. pdev->plusconter++;
  208. // Van_Device_Printf(VAN_LOG_NOTICE, "ID:%d plus:%d\n",pdev->ID,pdev->plusconter);
  209. }
  210. pdev++;
  211. }
  212. }
  213. /****************************************************************
  214. * 函数名: check_Pwm_Plus_feedOK
  215. * 创建时间: 2024/01/08
  216. * 创建人: 范义东
  217. * 函数说明:通过plusconter,检查是否转到
  218. * 输入参数: 无
  219. * 输出参数: 无
  220. * 返回值 : 有配置文件返回true,返回失败
  221. ****************************************************************/
  222. void check_Pwm_Plus_feedOK(void) {
  223. P_VAN_COM_PWM_Def pdev = gcom_pwm_V1;
  224. for (int i = 0; i < gcom_pwm_V1_Num; i++) {
  225. if (pdev->state == PWM_BUMP_ST_RUN && pdev->feedbackChanlen != VAN_CONFIG_NOCARE) {
  226. pdev->plusconter = 0;
  227. }
  228. pdev++;
  229. }
  230. }
  231. /**********************************************************************************
  232. Func Name: Paltform_Set_PWM_Pause
  233. Descriptions: 平台设置暂停PWM
  234. Input para: 无
  235. In&Out Para: 无
  236. Output para: 无
  237. Return value: 无
  238. ***********************************************************************************/
  239. void Paltform_Set_PWM_Pause(unsigned int id) {
  240. P_VAN_COM_PWM_Def dev;
  241. // float goal = 0; /*安1000配置占空比*/
  242. if (com_pwm_FindChanle(id, &dev) == True) {
  243. com_pwm_Set(id, 0);
  244. dev->state = PWM_BUMP_ST_IDLE;
  245. }
  246. }
  247. /**********************************************************************************
  248. Func Name: Paltform_Set_PWM_Resume
  249. Descriptions: 平台设置恢复PWM
  250. Input para: 无
  251. In&Out Para: 无
  252. Output para: 无
  253. Return value: 无
  254. ***********************************************************************************/
  255. void Paltform_Set_PWM_Resume(unsigned int id) {
  256. P_VAN_COM_PWM_Def dev;
  257. if (com_pwm_FindChanle(id, &dev) == True) {
  258. com_pwm_Set(id, dev->setValue);
  259. dev->state = PWM_BUMP_ST_RUN;
  260. }
  261. }