| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- /*
- * Copyright (c) 2006-2020, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2020-05-23 Administrator the first version
- */
- #include <rtdevice.h> //使用 RT-Thread 的设备需要包含此头文件
- #include <beep.h>
- #include <control.h>
- #include "hmi.h"
- Device_Status_typedef device_status;
- struct rt_device_pwm *pwm_device = RT_NULL; // 定义 pwm 设备指针
- struct rt_device_pwm *pwm_tim8 = RT_NULL; // 定义 pwm 设备指针
- /*初始化蜂鸣器*/
- int beep_init(void)
- {
- /*查找PWM设备*/
- pwm_device = (struct rt_device_pwm *)rt_device_find(BEEP_PWM_DEVICE);
- if (pwm_device == RT_NULL)
- {
- rt_kprintf("pwm device %s not found!\n", BEEP_PWM_DEVICE);
- return -RT_ERROR;
- }
- return 0;
- }
- /*打开蜂鸣器*/
- int pwm_on(uint8_t pwn_ch, rt_uint32_t pwm_freq)
- {
- rt_pwm_set(pwm_device, pwn_ch, pwm_freq, pwm_freq / 2);
- rt_pwm_enable(pwm_device, pwn_ch); // 使能蜂鸣器对应的 PWM 通道
- return 0;
- }
- /*关闭蜂鸣器*/
- int pwm_off(uint8_t pwn_ch, rt_uint32_t pwm_freq)
- {
- rt_pwm_set(pwm_device, pwn_ch, pwm_freq, 0);
- rt_pwm_disable(pwm_device, pwn_ch); // 使能蜂鸣器对应的 PWM 通道
- return 0;
- }
- int pwm8_init(void)
- {
- pwm_tim8 = (struct rt_device_pwm *)rt_device_find("pwm8");
- if (pwm_tim8 == RT_NULL)
- {
- rt_kprintf("pwm device pwm8 not found!\n");
- return -RT_ERROR;
- }
- return 0;
- }
- /*打开蜂鸣器*/
- int beep_on(void)
- {
- rt_pwm_enable(pwm_device, BEEP_PWM_CH); // 使能蜂鸣器对应的 PWM 通道
- return 0;
- }
- /*关闭蜂鸣器*/
- int beep_off(void)
- {
- rt_pwm_disable(pwm_device, BEEP_PWM_CH); // 失能蜂鸣器对应的 PWM 通道
- return 0;
- }
- /*在蜂鸣器设定函数里需要设定 蜂鸣器的频率和音量。PWM 设备设定的 API 是设定 周期 和 脉宽 的,
- * 因此我们需要转换一下,将频率装换成周期,将音量大小(占空比)转换成脉宽。这里的周期的单位是 ns,
- * 因此转换成的 秒 之后还要乘以 10^9 。由于无源蜂鸣器一般是低电平触发的,因此音量越大对应的脉宽就要越小。
- * 然后,将转换后的数据传入 rt_pwm_set 来设置 PWM 设备的参数。
- *
- */
- void beep_set(uint32_t freq, uint32_t volume)
- {
- rt_uint32_t period, pulse;
- beep_init();
- /* 将频率转化为周期 周期单位:ns 频率单位:HZ */
- // period = 1000000000 / freq; //unit:ns 1/HZ*10^9 = ns
- period = freq; /* 周期为0.5ms,单位为纳秒500000ns-200k */
- /* 根据声音大小计算占空比 蜂鸣器低电平触发 */
- pulse = volume; // 5000
- /* 利用 PWM API 设定 周期和占空比 */
- rt_pwm_set(pwm_device, BEEP_PWM_CH, period, pulse); // channel,period,pulse
- rt_pwm_enable(pwm_device, BEEP_PWM_CH);
- }
- void Beep_Tip(uint16_t volnum)
- {
- rt_pin_mode(Beep, PIN_MODE_OUTPUT);
- rt_pin_write(Beep, 1);
- rt_thread_mdelay(volnum);
- rt_pin_write(Beep, 0);
- }
- void Motor_Juandai(uint8_t on_off)
- {
- pwm8_init();
- rt_pwm_set(pwm_tim8, PC7_TIM3_CH, 200000, 100000); // channel,period,pulse
- //
- if (on_off == ON)
- {
- rt_pwm_enable(pwm_tim8, PC7_TIM3_CH);
- }
- else
- {
- rt_pwm_disable(pwm_tim8, PC7_TIM3_CH);
- }
- }
- void Motor_Qingsao_R_PWM(uint8_t on_off)
- {
- pwm8_init();
- rt_pwm_set(pwm_tim8, PC7_TIM3_CH, 200000, 150000); // channel,period,pulse
- if (on_off == ON)
- {
- rt_pwm_enable(pwm_tim8, PC7_TIM3_CH);
- }
- else
- {
- rt_pwm_disable(pwm_tim8, PC7_TIM3_CH);
- }
- }
- void Motor_Qingsao_L_PWM(uint8_t on_off)
- {
- pwm8_init();
- rt_pwm_set(pwm_tim8, PC8_TIM3_CH, 200000, 150000); // channel,period,pulse
- if (on_off == ON)
- {
- rt_pwm_enable(pwm_tim8, PC8_TIM3_CH);
- }
- else
- {
- rt_pwm_disable(pwm_tim8, PC8_TIM3_CH);
- }
- }
- /**
- * @brief 风机调速
- *
- * @param on_off 开关
- * @param percent 百分比
- */
- void CollFanSetPWM(uint8_t percent)
- {
- #define PWMMax 1000000
- if (percent < 20 || percent > 100)
- {
- return;
- }
- char pwm_change = 100 - percent;
- rt_kprintf(" CollFanSetPWM > %d\n" ,percent);
- beep_set(PWMMax, PWMMax * pwm_change / 100); // 驱动器使能
- }
- // void coll_set25(void)
- //{
- // CollFanSetPWM( 25);
- // }
- //
- // void coll_set50(void)
- //{
- // CollFanSetPWM( 50);
- // }
- //
- // void coll_set75(void)
- //{
- // CollFanSetPWM( 75);
- // }
- //
- // void coll_set100(void)
- //{
- // CollFanSetPWM( 100);
- // }
- //
- // void coll_setOFF(void)
- //{
- // CollFanSetPWM(10);
- // }
- //
- // MSH_CMD_EXPORT(coll_set25 , coll_set25);
- // MSH_CMD_EXPORT(coll_set50 , coll_set50);
- // MSH_CMD_EXPORT(coll_set75 , coll_set75);
- // MSH_CMD_EXPORT(coll_set100 , coll_set100);
- // MSH_CMD_EXPORT(coll_setOFF , coll_setOFF);
- void Motor_shake(uint8_t status_shake, uint16_t shake_sec)
- {
- beep_init();
- rt_pwm_set(pwm_device, PB1_TIM3_CH, 200000, 150000); // channel,period,pulse
- if (status_shake == ON)
- {
- rt_pwm_enable(pwm_device, PB1_TIM3_CH);
- if (shake_sec != 0)
- {
- rt_thread_delay(shake_sec * 1000);
- rt_pwm_disable(pwm_device, PB1_TIM3_CH);
- HMI_WRITE("cangWei.switchShake.val=%d", 0);
- }
- }
- else
- {
- rt_pwm_disable(pwm_device, PB1_TIM3_CH);
- HMI_WRITE("cangWei.switchShake.val=%d", 0);
- }
- }
|