beep.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-05-23 Administrator the first version
  9. */
  10. #include <rtdevice.h> //使用 RT-Thread 的设备需要包含此头文件
  11. #include <beep.h>
  12. #include <control.h>
  13. #include "hmi.h"
  14. Device_Status_typedef device_status;
  15. struct rt_device_pwm *pwm_device = RT_NULL; // 定义 pwm 设备指针
  16. struct rt_device_pwm *pwm_tim8 = RT_NULL; // 定义 pwm 设备指针
  17. /*初始化蜂鸣器*/
  18. int beep_init(void)
  19. {
  20. /*查找PWM设备*/
  21. pwm_device = (struct rt_device_pwm *)rt_device_find(BEEP_PWM_DEVICE);
  22. if (pwm_device == RT_NULL)
  23. {
  24. rt_kprintf("pwm device %s not found!\n", BEEP_PWM_DEVICE);
  25. return -RT_ERROR;
  26. }
  27. return 0;
  28. }
  29. /*打开蜂鸣器*/
  30. int pwm_on(uint8_t pwn_ch, rt_uint32_t pwm_freq)
  31. {
  32. rt_pwm_set(pwm_device, pwn_ch, pwm_freq, pwm_freq / 2);
  33. rt_pwm_enable(pwm_device, pwn_ch); // 使能蜂鸣器对应的 PWM 通道
  34. return 0;
  35. }
  36. /*关闭蜂鸣器*/
  37. int pwm_off(uint8_t pwn_ch, rt_uint32_t pwm_freq)
  38. {
  39. rt_pwm_set(pwm_device, pwn_ch, pwm_freq, 0);
  40. rt_pwm_disable(pwm_device, pwn_ch); // 使能蜂鸣器对应的 PWM 通道
  41. return 0;
  42. }
  43. int pwm8_init(void)
  44. {
  45. pwm_tim8 = (struct rt_device_pwm *)rt_device_find("pwm8");
  46. if (pwm_tim8 == RT_NULL)
  47. {
  48. rt_kprintf("pwm device pwm8 not found!\n");
  49. return -RT_ERROR;
  50. }
  51. return 0;
  52. }
  53. /*打开蜂鸣器*/
  54. int beep_on(void)
  55. {
  56. rt_pwm_enable(pwm_device, BEEP_PWM_CH); // 使能蜂鸣器对应的 PWM 通道
  57. return 0;
  58. }
  59. /*关闭蜂鸣器*/
  60. int beep_off(void)
  61. {
  62. rt_pwm_disable(pwm_device, BEEP_PWM_CH); // 失能蜂鸣器对应的 PWM 通道
  63. return 0;
  64. }
  65. /*在蜂鸣器设定函数里需要设定 蜂鸣器的频率和音量。PWM 设备设定的 API 是设定 周期 和 脉宽 的,
  66. * 因此我们需要转换一下,将频率装换成周期,将音量大小(占空比)转换成脉宽。这里的周期的单位是 ns,
  67. * 因此转换成的 秒 之后还要乘以 10^9 。由于无源蜂鸣器一般是低电平触发的,因此音量越大对应的脉宽就要越小。
  68. * 然后,将转换后的数据传入 rt_pwm_set 来设置 PWM 设备的参数。
  69. *
  70. */
  71. void beep_set(uint32_t freq, uint32_t volume)
  72. {
  73. rt_uint32_t period, pulse;
  74. beep_init();
  75. /* 将频率转化为周期 周期单位:ns 频率单位:HZ */
  76. // period = 1000000000 / freq; //unit:ns 1/HZ*10^9 = ns
  77. period = freq; /* 周期为0.5ms,单位为纳秒500000ns-200k */
  78. /* 根据声音大小计算占空比 蜂鸣器低电平触发 */
  79. pulse = volume; // 5000
  80. /* 利用 PWM API 设定 周期和占空比 */
  81. rt_pwm_set(pwm_device, BEEP_PWM_CH, period, pulse); // channel,period,pulse
  82. rt_pwm_enable(pwm_device, BEEP_PWM_CH);
  83. }
  84. void Beep_Tip(uint16_t volnum)
  85. {
  86. rt_pin_mode(Beep, PIN_MODE_OUTPUT);
  87. rt_pin_write(Beep, 1);
  88. rt_thread_mdelay(volnum);
  89. rt_pin_write(Beep, 0);
  90. }
  91. void Motor_Juandai(uint8_t on_off)
  92. {
  93. pwm8_init();
  94. rt_pwm_set(pwm_tim8, PC7_TIM3_CH, 200000, 100000); // channel,period,pulse
  95. //
  96. if (on_off == ON)
  97. {
  98. rt_pwm_enable(pwm_tim8, PC7_TIM3_CH);
  99. }
  100. else
  101. {
  102. rt_pwm_disable(pwm_tim8, PC7_TIM3_CH);
  103. }
  104. }
  105. void Motor_Qingsao_R_PWM(uint8_t on_off)
  106. {
  107. pwm8_init();
  108. rt_pwm_set(pwm_tim8, PC7_TIM3_CH, 200000, 150000); // channel,period,pulse
  109. if (on_off == ON)
  110. {
  111. rt_pwm_enable(pwm_tim8, PC7_TIM3_CH);
  112. }
  113. else
  114. {
  115. rt_pwm_disable(pwm_tim8, PC7_TIM3_CH);
  116. }
  117. }
  118. void Motor_Qingsao_L_PWM(uint8_t on_off)
  119. {
  120. pwm8_init();
  121. rt_pwm_set(pwm_tim8, PC8_TIM3_CH, 200000, 150000); // channel,period,pulse
  122. if (on_off == ON)
  123. {
  124. rt_pwm_enable(pwm_tim8, PC8_TIM3_CH);
  125. }
  126. else
  127. {
  128. rt_pwm_disable(pwm_tim8, PC8_TIM3_CH);
  129. }
  130. }
  131. /**
  132. * @brief 风机调速
  133. *
  134. * @param on_off 开关
  135. * @param percent 百分比
  136. */
  137. void CollFanSetPWM(uint8_t percent)
  138. {
  139. #define PWMMax 1000000
  140. if (percent < 0 || percent > 100)
  141. {
  142. return;
  143. }
  144. beep_set(PWMMax, PWMMax * percent / 100); // 驱动器使能
  145. }
  146. // void coll_set25(void)
  147. //{
  148. // CollFanSetPWM( 25);
  149. // }
  150. //
  151. // void coll_set50(void)
  152. //{
  153. // CollFanSetPWM( 50);
  154. // }
  155. //
  156. // void coll_set75(void)
  157. //{
  158. // CollFanSetPWM( 75);
  159. // }
  160. //
  161. // void coll_set100(void)
  162. //{
  163. // CollFanSetPWM( 100);
  164. // }
  165. //
  166. // void coll_setOFF(void)
  167. //{
  168. // CollFanSetPWM(10);
  169. // }
  170. //
  171. // MSH_CMD_EXPORT(coll_set25 , coll_set25);
  172. // MSH_CMD_EXPORT(coll_set50 , coll_set50);
  173. // MSH_CMD_EXPORT(coll_set75 , coll_set75);
  174. // MSH_CMD_EXPORT(coll_set100 , coll_set100);
  175. // MSH_CMD_EXPORT(coll_setOFF , coll_setOFF);
  176. void Motor_shake(uint8_t status_shake, uint16_t shake_sec)
  177. {
  178. beep_init();
  179. rt_pwm_set(pwm_device, PB1_TIM3_CH, 200000, 150000); // channel,period,pulse
  180. if (status_shake == ON)
  181. {
  182. rt_pwm_enable(pwm_device, PB1_TIM3_CH);
  183. if (shake_sec != 0)
  184. {
  185. rt_thread_delay(shake_sec * 1000);
  186. rt_pwm_disable(pwm_device, PB1_TIM3_CH);
  187. HMI_WRITE("cangWei.switchShake.val=%d", 0);
  188. }
  189. }
  190. else
  191. {
  192. rt_pwm_disable(pwm_device, PB1_TIM3_CH);
  193. HMI_WRITE("cangWei.switchShake.val=%d", 0);
  194. }
  195. }