beep.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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 < 20 || percent > 100)
  141. {
  142. return;
  143. }
  144. char pwm_change = 100 - percent;
  145. rt_kprintf(" CollFanSetPWM > %d\n" ,percent);
  146. beep_set(PWMMax, PWMMax * pwm_change / 100); // 驱动器使能
  147. }
  148. // void coll_set25(void)
  149. //{
  150. // CollFanSetPWM( 25);
  151. // }
  152. //
  153. // void coll_set50(void)
  154. //{
  155. // CollFanSetPWM( 50);
  156. // }
  157. //
  158. // void coll_set75(void)
  159. //{
  160. // CollFanSetPWM( 75);
  161. // }
  162. //
  163. // void coll_set100(void)
  164. //{
  165. // CollFanSetPWM( 100);
  166. // }
  167. //
  168. // void coll_setOFF(void)
  169. //{
  170. // CollFanSetPWM(10);
  171. // }
  172. //
  173. // MSH_CMD_EXPORT(coll_set25 , coll_set25);
  174. // MSH_CMD_EXPORT(coll_set50 , coll_set50);
  175. // MSH_CMD_EXPORT(coll_set75 , coll_set75);
  176. // MSH_CMD_EXPORT(coll_set100 , coll_set100);
  177. // MSH_CMD_EXPORT(coll_setOFF , coll_setOFF);
  178. void Motor_shake(uint8_t status_shake, uint16_t shake_sec)
  179. {
  180. beep_init();
  181. rt_pwm_set(pwm_device, PB1_TIM3_CH, 200000, 150000); // channel,period,pulse
  182. if (status_shake == ON)
  183. {
  184. rt_pwm_enable(pwm_device, PB1_TIM3_CH);
  185. if (shake_sec != 0)
  186. {
  187. rt_thread_delay(shake_sec * 1000);
  188. rt_pwm_disable(pwm_device, PB1_TIM3_CH);
  189. HMI_WRITE("cangWei.switchShake.val=%d", 0);
  190. }
  191. }
  192. else
  193. {
  194. rt_pwm_disable(pwm_device, PB1_TIM3_CH);
  195. HMI_WRITE("cangWei.switchShake.val=%d", 0);
  196. }
  197. }