台架调试时 CAN 设备(尤其 Pitch)掉线会按 legacy 语义每 2s 响 n 下,连续 滴滴声很吵且影响听其它声音,故加一个开关: robot_param.h -> 台架调试开关 #define DEBUG_BUZZER_MELODY 1 // 1=警告音换旋律;0=legacy 报警(比赛用) 实现分三处: - robot_param.h: 新增开关,与 DEBUG_SHOOT_WITHOUT_REFEREE 放在同一分区 - modules/BUZZER: 新增 buzzer_play_melody(step) —— 按固定 100ms/步 推进, 内部对旋律总步数取模自动循环;旋律表 buzzer_melody[] 用"上行分解和弦 + 回落"共 14 步(1.4s),空拍 BUZZER_P 作断音,选音限定中音3~高音2 避免刺耳。 驱动层本身不判断开关,保持纯外设职责,只是多了一个音符序列接口。 - monitor_task.c: CAN 掉线分支按开关二选一。旋律模式下步进用本任务自身的 100ms 节拍(与文件里已有的遥控器连接音效同一写法),不用 HAL_GetTick 采样,避免周期抖动漏掉或重复音符。 设计取舍: 只替换"声音",不替换"灯语" —— 红灯常亮、遥控器掉线红灯双闪、 BMI088 失败绿灯双闪等 LED 语义完全不变,因此调试时仍能一眼看出是哪台 设备掉线;linkcheck_first_offline() 也保留调用,方便在调试器里直接看结果。 比赛前把 DEBUG_BUZZER_MELODY 改回 0 即恢复 legacy 报警。 两个工程同步修改,内容保持一致。
65 lines
2.6 KiB
C
65 lines
2.6 KiB
C
/* =============================================================================
|
|
* buzzer.c - C 板无源蜂鸣器(TIM4_CH3, PD14)
|
|
* 说明: 音调表与 legacy 完全一致(ARR 固定 10 分频,改 PSC 变调,
|
|
* 装载用 HAL_TIM_GenerateEvent 立即生效);buzzer_init 必须在
|
|
* CAN_Task 中调用一次启动 PWM 输出,否则所有报警/音效无声
|
|
* ========================================================================== */
|
|
#include "buzzer.h"
|
|
#include "tim.h"
|
|
|
|
extern TIM_HandleTypeDef htim4;
|
|
|
|
/* 蜂鸣器音调频率表(ARR 固定 10 分频下的 PSC 值,与 legacy 一致) */
|
|
static const uint16_t buzzer_tone_freq[37] = {
|
|
0,
|
|
32107, 30305, 28604, 26999, 25483, 24053, 22703, 21429, 20226, 19091, 18019, 17008,
|
|
16053, 15152, 14302, 13499, 12742, 12026, 11352, 10714, 10113, 9545, 9010, 8504,
|
|
8027, 7576, 7151, 6750, 6371, 6013, 5676, 5357, 5056, 4773, 4505, 4252,
|
|
};
|
|
|
|
void buzzer_init(void)
|
|
{
|
|
/* 与 legacy 相同:ARR=10 分频,CubeMX 的 ARR=65535 改为 9 */
|
|
__HAL_TIM_SET_AUTORELOAD(&htim4, 10 - 1);
|
|
__HAL_TIM_SET_PRESCALER(&htim4, 19091);
|
|
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0);
|
|
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);
|
|
}
|
|
|
|
void buzzer_on(buzzer_tone_e tone)
|
|
{
|
|
if (tone != BUZZER_P)
|
|
{
|
|
__HAL_TIM_SET_PRESCALER(&htim4, buzzer_tone_freq[tone]);
|
|
HAL_TIM_GenerateEvent(&htim4, TIM_EVENTSOURCE_UPDATE); // 立即装载 PSC
|
|
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 5); // 占空比 50%
|
|
}
|
|
else
|
|
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0);
|
|
}
|
|
|
|
void buzzer_off(void)
|
|
{
|
|
__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, 0);
|
|
}
|
|
|
|
/* ==========================================================================
|
|
* 调试用旋律(见 buzzer.h):每步 100ms,空拍 BUZZER_P 为静音。
|
|
* 无源蜂鸣器只有单音,这里用"上行分解和弦 + 回落"拼成一句短旋律;选音限定
|
|
* 在中音 3 ~ 高音 2,避免刺耳。循环播放不会漏掉"有设备掉线"这一事实,
|
|
* 因为红灯常亮由 monitor_task 独立控制,与该旋律无关。
|
|
* 改旋律:直接增删这里的音符即可,长度会自动生效。
|
|
* ========================================================================== */
|
|
static const buzzer_tone_e buzzer_melody[] = {
|
|
BUZZER_M3, BUZZER_M5, BUZZER_M6, BUZZER_H1, BUZZER_P,
|
|
BUZZER_M6, BUZZER_H1, BUZZER_H2, BUZZER_P,
|
|
BUZZER_H1, BUZZER_M6, BUZZER_M5, BUZZER_M3, BUZZER_P,
|
|
};
|
|
|
|
void buzzer_play_melody(uint16_t step)
|
|
{
|
|
const uint16_t steps =
|
|
(uint16_t)(sizeof(buzzer_melody) / sizeof(buzzer_melody[0]));
|
|
buzzer_on(buzzer_melody[step % steps]);
|
|
}
|