暂存,频率检测可以,按键不对
This commit is contained in:
parent
ff9c225b0d
commit
5c469b4378
|
@ -19,6 +19,7 @@
|
||||||
"bsp_valve.h": "c",
|
"bsp_valve.h": "c",
|
||||||
"log.h": "c",
|
"log.h": "c",
|
||||||
"hal.h": "c",
|
"hal.h": "c",
|
||||||
"bsp_iwdg.h": "c"
|
"bsp_iwdg.h": "c",
|
||||||
|
"bsp_valve_dect.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -723,21 +723,21 @@ static void peripheralStateNotificationCB(gapRole_States_t newState, gapRoleEven
|
||||||
*/
|
*/
|
||||||
static void performPeriodicTask(void)
|
static void performPeriodicTask(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
gValveData.bat = BSP_ReadVbat();
|
gValveData.bat = BSP_ReadVbat();
|
||||||
|
|
||||||
|
#if 0
|
||||||
BSP_BlockSleep();
|
BSP_BlockSleep();
|
||||||
BSP_RequestBoost();
|
BSP_RequestBoost();
|
||||||
// DelayMs(1);
|
// DelayMs(1);
|
||||||
ShowLed();
|
ShowLed();
|
||||||
|
|
||||||
DelayMs(5);
|
DelayMs(2);
|
||||||
LED_ALL_OFF_DEINIT;
|
LED_ALL_OFF_DEINIT;
|
||||||
// BEEP_OFF_DEINIT;
|
// BEEP_OFF_DEINIT;
|
||||||
|
|
||||||
BSP_NoNeedBoost();
|
BSP_NoNeedBoost();
|
||||||
BSP_RequestSleep();
|
BSP_RequestSleep();
|
||||||
|
#endif
|
||||||
// µçѹ¹ýµÍ¾Í¹Ø·§
|
// µçѹ¹ýµÍ¾Í¹Ø·§
|
||||||
if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE)
|
if (gValveData.bat <= LOW_VABAT_CLOSE_VALUE)
|
||||||
{
|
{
|
||||||
|
@ -760,7 +760,7 @@ static void performPeriodicTask(void)
|
||||||
logError("Read TempHumi Err");
|
logError("Read TempHumi Err");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 1
|
||||||
logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d"
|
logDebug("switch_status:%d Temp:%d Bat:%d Humi:%d%% RSSI: %d"
|
||||||
, gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi);
|
, gValveData.switch_status, gValveData.temp, gValveData.bat, gValveData.humi, gValveData.rssi);
|
||||||
|
|
||||||
|
|
|
@ -46,38 +46,42 @@ void app_task_handler(TeAppEvtType app_evt_type)
|
||||||
BSP_BlockSleep();
|
BSP_BlockSleep();
|
||||||
BSP_RequestBoost();
|
BSP_RequestBoost();
|
||||||
|
|
||||||
|
// DelayMs(15);
|
||||||
|
|
||||||
switch (app_evt_type)
|
switch (app_evt_type)
|
||||||
{
|
{
|
||||||
case kKeyShort:
|
case kKeyShort:
|
||||||
logDebug("button short press");
|
logDebug("button short press");
|
||||||
key_press_cnt++;
|
key_press_cnt++;
|
||||||
logDebug("key_press_cnt = %d", key_press_cnt);
|
logDebug("key_press_cnt = %d", key_press_cnt);
|
||||||
if (key_press_cnt == 1)
|
|
||||||
|
if (valve_switch_dect_flag)
|
||||||
{
|
{
|
||||||
|
valve_switch_dect_flag = 0;
|
||||||
|
|
||||||
logDebug("LED显示状态");
|
logDebug("LED显示状态");
|
||||||
// tmos_set_event(led_task_id, LED_SHOW_START_EVT);
|
// tmos_set_event(led_task_id, LED_SHOW_START_EVT);
|
||||||
BSP_BlockSleep();
|
BSP_BlockSleep();
|
||||||
BSP_RequestBoost();
|
BSP_RequestBoost();
|
||||||
DelayMs(1);
|
DelayMs(1);
|
||||||
ShowLed();
|
ShowLed();
|
||||||
// tmos_stop_task(led_task_id, LED_SHOW_ONCE_EVT);
|
|
||||||
// tmos_start_task(led_task_id, LED_SHOW_ONCE_EVT, 1000);
|
|
||||||
}
|
}
|
||||||
else if (key_press_cnt == 2)
|
if (key_press_cnt >= 2)
|
||||||
{
|
{
|
||||||
if (gValveData.switch_status == kClosed)
|
// if (gValveData.switch_status == kClosed)
|
||||||
{
|
// {
|
||||||
logDebug("kClosed-->kOpened");
|
// logDebug("kClosed-->kOpened");
|
||||||
// tmos_set_event(led_task_id, LED_SHOW_START_EVT);
|
// // tmos_set_event(led_task_id, LED_SHOW_START_EVT);
|
||||||
gValveData.switch_status = kOpened;
|
// gValveData.switch_status = kOpened;
|
||||||
BSP_BlockSleep();
|
// BSP_BlockSleep();
|
||||||
BSP_RequestBoost();
|
// BSP_RequestBoost();
|
||||||
DelayMs(1);
|
// DelayMs(1);
|
||||||
ShowLed();
|
// ShowLed();
|
||||||
// tmos_stop_task(led_task_id, LED_SHOW_ONCE_EVT);
|
// // tmos_stop_task(led_task_id, LED_SHOW_ONCE_EVT);
|
||||||
// tmos_start_task(led_task_id, LED_SHOW_ONCE_EVT, 1000);
|
// // tmos_start_task(led_task_id, LED_SHOW_ONCE_EVT, 1000);
|
||||||
}
|
// }
|
||||||
else if (gValveData.switch_status != kClosed)
|
// else
|
||||||
|
if (gValveData.switch_status != kClosed)
|
||||||
{
|
{
|
||||||
logDebug("kOpened-->kClosed");
|
logDebug("kOpened-->kClosed");
|
||||||
gValveData.switch_status = kClosed;
|
gValveData.switch_status = kClosed;
|
||||||
|
@ -194,7 +198,6 @@ int main(void)
|
||||||
|
|
||||||
BSP_BEEP_LED_EMV_Init();
|
BSP_BEEP_LED_EMV_Init();
|
||||||
|
|
||||||
|
|
||||||
logDebug("Start @ChipID=%02X\n", R8_CHIP_ID);
|
logDebug("Start @ChipID=%02X\n", R8_CHIP_ID);
|
||||||
logError("中文测试 %2.2f", 123.456);
|
logError("中文测试 %2.2f", 123.456);
|
||||||
|
|
||||||
|
@ -210,19 +213,107 @@ int main(void)
|
||||||
|
|
||||||
BSP_KEY_Init(app_task_handler);
|
BSP_KEY_Init(app_task_handler);
|
||||||
|
|
||||||
|
DelayMs(10);
|
||||||
BSP_ADC_Init();
|
BSP_ADC_Init();
|
||||||
|
|
||||||
BSP_VAVLE_Init();
|
|
||||||
|
|
||||||
|
|
||||||
BSP_BlockSleep();
|
BSP_BlockSleep();
|
||||||
BSP_RequestBoost();
|
BSP_RequestBoost();
|
||||||
|
#if 0
|
||||||
DelayMs(1);
|
DelayMs(1);
|
||||||
|
EMV_CHARGE_EN;
|
||||||
|
logDebug("EMV_CHARGE_EN");
|
||||||
|
DelayMs(1500);
|
||||||
|
|
||||||
|
BOOST_EN;
|
||||||
|
// 关阀动作,一定要先关充电的,防止其他12V用电
|
||||||
|
EMV_CHARGE_OFF_DEINIT;
|
||||||
|
BEEP_ON;
|
||||||
|
logDebug("EMV_CHARGE_OFF_DEINIT");
|
||||||
|
EMV_ON;
|
||||||
|
logDebug("EMV_ON");
|
||||||
|
DelayMs(100);
|
||||||
|
|
||||||
|
BEEP_OFF_DEINIT;
|
||||||
|
EMV_CHARGE_OFF_DEINIT;
|
||||||
|
EMV_OFF_DEINIT;
|
||||||
|
LED_ALL_OFF_DEINIT;
|
||||||
|
|
||||||
|
DelayMs(100);
|
||||||
|
|
||||||
|
BSP_VAVLE_Init();
|
||||||
|
VavleDect_Start();
|
||||||
|
DelayMs(10);
|
||||||
|
valve_switch_off_freq = VavleDect_GetFreq();
|
||||||
|
logDebug("valve_switch_off_freq = %06d Hz", valve_switch_off_freq);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
LED_ALL_OFF_DEINIT;
|
||||||
|
DelayMs(500);
|
||||||
|
LED_R_ON;
|
||||||
|
DelayMs(500);
|
||||||
|
if (IS_KEY_Vaild())
|
||||||
|
{
|
||||||
|
DelayMs(20);
|
||||||
|
if (IS_KEY_Vaild())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DelayMs(100);
|
||||||
|
|
||||||
|
BSP_VAVLE_Init();
|
||||||
|
VavleDect_Start();
|
||||||
|
DelayMs(10);
|
||||||
|
valve_switch_on_freq = VavleDect_GetFreq();
|
||||||
|
logDebug("valve_switch_on_freq = %06d Hz", valve_switch_on_freq);
|
||||||
|
valve_switch_freq = valve_switch_on_freq;
|
||||||
|
VavleDect_Switch();
|
||||||
|
#endif
|
||||||
|
BSP_VAVLE_Init();
|
||||||
|
|
||||||
ShowLed();
|
ShowLed();
|
||||||
BEEP_ON;
|
BEEP_ON;
|
||||||
|
|
||||||
DelayMs(1000 * 1);
|
DelayMs(1000 * 1);
|
||||||
|
|
||||||
|
// tmos_set_event(Peripheral_TaskID, SBP_REPLY_CMD_EVT);
|
||||||
|
#if 0
|
||||||
|
// GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_Floating);
|
||||||
|
|
||||||
|
// TMR3功能引脚映射选择位:
|
||||||
|
// 1:TMR3_/PWM3_/CAP3_映射到PA[2];
|
||||||
|
R16_PIN_ALTERNATE |= (1 << 3);
|
||||||
|
logDebug("TMR3_CapInit 0");
|
||||||
|
|
||||||
|
TMR3_CapInit(FallEdge_To_FallEdge);
|
||||||
|
// (1 / 62.4MHz) * 2的26次方 = 0.01602564102564102564102564102564 us * 67108864 约等于 1.0754625641025641025641025641025 S
|
||||||
|
// TMR3_CAPTimeoutCfg(FREQ_SYS ); // 设置捕捉超时时间
|
||||||
|
TMR3_CAPTimeoutCfg(GetSysClock() / 100); // 设置捕捉超时时间 10ms
|
||||||
|
|
||||||
|
// TMR3_CAPTimeoutCfg(0x3FFFFFF); // 设置捕捉超时时间
|
||||||
|
TMR3_DMACfg(ENABLE, (uint16_t)(uint32_t)&CapBuf[0], (uint16_t)(uint32_t)&CapBuf[20], Mode_Single);
|
||||||
|
TMR3_ITCfg(ENABLE, TMR0_3_IT_DMA_END); // 开启DMA完成中断
|
||||||
|
PFIC_EnableIRQ(TMR3_IRQn);
|
||||||
|
|
||||||
|
logDebug("TMR3_CapInit");
|
||||||
|
while(capFlag == 0);
|
||||||
|
capFlag = 0;
|
||||||
|
for(uint8_t i = 0; i < 20; i++)
|
||||||
|
{
|
||||||
|
logDebug("%08ld ", CapBuf[i] & 0x1ffffff); // 26bit, 最高位表示 高电平还是低电平
|
||||||
|
uint16_t t = ((CapBuf[i] & 0x1ffffff) * 1.0f) / FREQ_SYS * 1000000;
|
||||||
|
uint16_t f = 1000000 / t;
|
||||||
|
logDebug("T = %04d us, f = %04d Hz", t, f);
|
||||||
|
BSP_UART1_TxLoop();
|
||||||
|
}
|
||||||
|
|
||||||
|
// DelayMs(1000 * 30);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
LED_ALL_OFF_DEINIT;
|
LED_ALL_OFF_DEINIT;
|
||||||
BEEP_OFF_DEINIT;
|
BEEP_OFF_DEINIT;
|
||||||
|
|
||||||
|
@ -243,4 +334,6 @@ int main(void)
|
||||||
Main_Circulation();
|
Main_Circulation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************** endfile @ main ******************************/
|
/******************************** endfile @ main ******************************/
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author : stark1898y 1658608470@qq.com
|
* @Author : stark1898y 1658608470@qq.com
|
||||||
* @Date : 2024-12-12 15:55:38
|
* @Date : 2024-12-12 15:55:38
|
||||||
* @LastEditors : stark1898y 1658608470@qq.com
|
* @LastEditors : stark1898y 1658608470@qq.com
|
||||||
* @LastEditTime : 2024-12-17 15:51:09
|
* @LastEditTime : 2025-02-24 16:39:07
|
||||||
* @FilePath : \BLE_TYQ_CH584M\BSP\inc\bsp_valve.h
|
* @FilePath : \BLE_TYQ_CH584M\BSP\inc\bsp_valve.h
|
||||||
* @Description :
|
* @Description :
|
||||||
*
|
*
|
||||||
|
@ -23,9 +23,15 @@ extern tmosTaskID vavle_task_id;
|
||||||
#define VAVLE_CLOSE_ACTION_EVT (0x0001 << 3) // 关阀,动作
|
#define VAVLE_CLOSE_ACTION_EVT (0x0001 << 3) // 关阀,动作
|
||||||
#define VAVLE_CLOSE_END_EVT (0x0001 << 4) // 关阀结束
|
#define VAVLE_CLOSE_END_EVT (0x0001 << 4) // 关阀结束
|
||||||
|
|
||||||
#define VAVLE_LOW_VBAT_ALARM_EVT (0x0001 << 5) // 低电压提醒
|
#define VAVLE_DECT_SWITCH_START_EVT (0x0001 << 5) // 检测电磁铁
|
||||||
|
#define VAVLE_DECT_SWITCH_END_EVT (0x0001 << 6) // 检测电磁铁
|
||||||
|
|
||||||
|
#define VAVLE_LOW_VBAT_ALARM_EVT (0x0001 << 7) // 低电压提醒
|
||||||
|
|
||||||
|
#define VAVLE_LOOP_DECT_EVT (0x0001 << 8) // 循环检测
|
||||||
|
|
||||||
|
#define VAVLE_DECT_SWITCH_CALIB_EVT (0x0001 << 9) // 标定电磁铁
|
||||||
|
|
||||||
#define VAVLE_DECT_EVT (0x0001 << 6) // 循环检测
|
|
||||||
|
|
||||||
|
|
||||||
#define VALVE_LOW_VBAT_ALARM_PERIOD_MS (1600 * 60 * 10)
|
#define VALVE_LOW_VBAT_ALARM_PERIOD_MS (1600 * 60 * 10)
|
||||||
|
@ -84,8 +90,15 @@ typedef enum
|
||||||
kUnknown = 0,
|
kUnknown = 0,
|
||||||
kClosed,
|
kClosed,
|
||||||
kOpened,
|
kOpened,
|
||||||
|
kDisconnect,
|
||||||
} TeValveSwitchStatus;
|
} TeValveSwitchStatus;
|
||||||
|
|
||||||
|
extern uint16_t valve_switch_on_freq;
|
||||||
|
extern uint16_t valve_switch_off_freq;
|
||||||
|
extern uint16_t valve_switch_freq;
|
||||||
|
|
||||||
|
extern volatile uint8_t valve_switch_dect_flag;
|
||||||
|
|
||||||
typedef struct __attribute__((packed))
|
typedef struct __attribute__((packed))
|
||||||
{
|
{
|
||||||
// uint8_t status; // 1B 阀门工作状态 超欠压、过流
|
// uint8_t status; // 1B 阀门工作状态 超欠压、过流
|
||||||
|
@ -105,6 +118,10 @@ extern TsValveData gValveData;
|
||||||
|
|
||||||
uint8_t CheckSum(const uint8_t *data, size_t len);
|
uint8_t CheckSum(const uint8_t *data, size_t len);
|
||||||
|
|
||||||
|
void VavleDect_Switch(void);
|
||||||
|
uint16_t VavleDect_GetFreq(void);
|
||||||
|
void VavleDect_Start(void);
|
||||||
|
|
||||||
void BSP_VAVLE_Init(void);
|
void BSP_VAVLE_Init(void);
|
||||||
|
|
||||||
TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint8_t len);
|
TsFrameData* BSP_VAVLE_GetFrameData(uint8_t *data, uint8_t len);
|
||||||
|
|
|
@ -25,12 +25,16 @@ uint16_t min_number = 0;
|
||||||
uint16_t max_number = 0;
|
uint16_t max_number = 0;
|
||||||
double voltage = 0;
|
double voltage = 0;
|
||||||
|
|
||||||
|
// https://www.cnblogs.com/iot-fan/p/14304854.html
|
||||||
uint8_t BSP_ReadVbat(void)
|
uint8_t BSP_ReadVbat(void)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
// VBAT
|
// VBAT
|
||||||
uint32_t CountBat = 0;
|
uint32_t CountBat = 0;
|
||||||
ADC_InterBATSampInit();
|
ADC_InterBATSampInit();
|
||||||
|
DelayUs(1);
|
||||||
|
ADC_ExcutSingleConver();
|
||||||
|
DelayUs(1);
|
||||||
for (i = 0; i < 20; i++)
|
for (i = 0; i < 20; i++)
|
||||||
{
|
{
|
||||||
adcBuff[i] = ADC_ExcutSingleConver(); // 连续采样20次
|
adcBuff[i] = ADC_ExcutSingleConver(); // 连续采样20次
|
||||||
|
@ -48,6 +52,9 @@ uint8_t BSP_ReadVbat(void)
|
||||||
}
|
}
|
||||||
logDebug("min_number = %d, max_number = %d", min_number, max_number);
|
logDebug("min_number = %d, max_number = %d", min_number, max_number);
|
||||||
CountBat = (CountBat - min_number - max_number) / 18; // 删除最小与最大值
|
CountBat = (CountBat - min_number - max_number) / 18; // 删除最小与最大值
|
||||||
|
// PGA=-12db
|
||||||
|
// CountBat = CountBat * 1050 / 512 - (3 * 1050);
|
||||||
|
CountBat = CountBat * 2.05078125 - 3150;
|
||||||
uint8_t vbat = (uint8_t)(CountBat / 100);
|
uint8_t vbat = (uint8_t)(CountBat / 100);
|
||||||
logDebug("AverageCountBat = %dmV, vbat = %d(100mV)", CountBat, vbat);
|
logDebug("AverageCountBat = %dmV, vbat = %d(100mV)", CountBat, vbat);
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ void ShowLed()
|
||||||
LED_ALL_OFF_DEINIT;
|
LED_ALL_OFF_DEINIT;
|
||||||
LED_Y_ON;
|
LED_Y_ON;
|
||||||
|
|
||||||
BEEP_ON;
|
// BEEP_ON;
|
||||||
logDebug("LED_Y_ON");
|
logDebug("LED_Y_ON");
|
||||||
}
|
}
|
||||||
else if (gValveData.switch_status == kUnknown || gValveData.switch_status == kClosed)
|
else if (gValveData.switch_status == kUnknown || gValveData.switch_status == kClosed)
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
#include "SLEEP.h"
|
#include "SLEEP.h"
|
||||||
|
#include "bsp_valve.h"
|
||||||
|
|
||||||
// https://www.cnblogs.com/iot-fan/p/14304943.html
|
// https://www.cnblogs.com/iot-fan/p/14304943.html
|
||||||
|
|
||||||
|
@ -250,7 +251,10 @@ void BSP_KEY_Init(app_task_evt_handler_t handler)
|
||||||
// 由外部上拉电阻了
|
// 由外部上拉电阻了
|
||||||
// 设置为浮空输入模式
|
// 设置为浮空输入模式
|
||||||
|
|
||||||
GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_PU);
|
// MCU_LDECT
|
||||||
|
// GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PU);
|
||||||
|
|
||||||
|
GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_Floating);
|
||||||
|
|
||||||
GPIOB_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_Floating);
|
GPIOB_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_Floating);
|
||||||
// GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeIN_Floating);
|
// GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeIN_Floating);
|
||||||
|
@ -269,9 +273,6 @@ void BSP_KEY_Init(app_task_evt_handler_t handler)
|
||||||
|
|
||||||
tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(KEY_SACN_MS));
|
tmos_start_task(key_task_id, KEY_SCAN_EVT, MS1_TO_SYSTEM_TIME(KEY_SACN_MS));
|
||||||
#endif
|
#endif
|
||||||
DelayMs(2);
|
|
||||||
logDebug("BSP_KEY_Init=%d", IS_KEY_Vaild());
|
|
||||||
DelayMs(2);
|
|
||||||
logDebug("BSP_KEY_Init=%d", IS_KEY_Vaild());
|
logDebug("BSP_KEY_Init=%d", IS_KEY_Vaild());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,6 +293,7 @@ void KEY_ProcessLoop(void)
|
||||||
|
|
||||||
key_wakeup_flag = 0;
|
key_wakeup_flag = 0;
|
||||||
tmos_set_event(key_task_id, KEY_SCAN_EVT);
|
tmos_set_event(key_task_id, KEY_SCAN_EVT);
|
||||||
|
tmos_set_event(vavle_task_id, VAVLE_DECT_SWITCH_START_EVT);
|
||||||
logDebug("KEY_ProcessLoop");
|
logDebug("KEY_ProcessLoop");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* @Author : stark1898y 1658608470@qq.com
|
* @Author : stark1898y 1658608470@qq.com
|
||||||
* @Date : 2024-12-15 15:01:15
|
* @Date : 2024-12-15 15:01:15
|
||||||
* @LastEditors : stark1898y 1658608470@qq.com
|
* @LastEditors : stark1898y 1658608470@qq.com
|
||||||
* @LastEditTime : 2025-02-22 17:20:22
|
* @LastEditTime : 2025-02-24 17:33:09
|
||||||
* @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_valve.c
|
* @FilePath : \BLE_TYQ_CH584M\BSP\src\bsp_valve.c
|
||||||
* @Description :
|
* @Description :
|
||||||
*
|
*
|
||||||
|
@ -36,6 +36,23 @@ TsRawFrameData RelyData;
|
||||||
// 存储 当前task id 的全局变量
|
// 存储 当前task id 的全局变量
|
||||||
tmosTaskID vavle_task_id = INVALID_TASK_ID;
|
tmosTaskID vavle_task_id = INVALID_TASK_ID;
|
||||||
|
|
||||||
|
#define ARRAY_SIZE(freq_arr) (sizeof(freq_arr) / sizeof((freq_arr)[0]))
|
||||||
|
|
||||||
|
volatile uint8_t cap_flag = 0;
|
||||||
|
__attribute__((aligned(4))) uint32_t cap_buf[20];
|
||||||
|
|
||||||
|
#define CAP_BUF_LEN (20)
|
||||||
|
|
||||||
|
#define CAP_FREQ_MIN (2000U)
|
||||||
|
#define CAP_FREQ_MAX (10000U)
|
||||||
|
|
||||||
|
uint16_t valve_switch_on_freq = 6535;
|
||||||
|
uint16_t valve_switch_off_freq = 7508;
|
||||||
|
|
||||||
|
uint16_t valve_switch_freq = 0;
|
||||||
|
|
||||||
|
volatile uint8_t valve_switch_dect_flag = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description: 从帧起始符开始到校验码之前所有字节的和的模256,即各字节不计超过255的溢出值的二进制算术和。
|
* @description: 从帧起始符开始到校验码之前所有字节的和的模256,即各字节不计超过255的溢出值的二进制算术和。
|
||||||
* @param {uint8_t} *data
|
* @param {uint8_t} *data
|
||||||
|
@ -54,6 +71,98 @@ uint8_t CheckSum(const uint8_t *data, size_t len)
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VavleDect_Start(void)
|
||||||
|
{
|
||||||
|
BSP_BlockSleep();
|
||||||
|
BSP_RequestBoost();
|
||||||
|
DelayMs(1);
|
||||||
|
|
||||||
|
tmos_memset(cap_buf, 0, sizeof(cap_buf));
|
||||||
|
|
||||||
|
// TMR3_CAPTimeoutCfg(0x3FFFFFF); // 设置捕捉超时时间
|
||||||
|
TMR3_DMACfg(ENABLE, (uint16_t)(uint32_t)&cap_buf[0], (uint16_t)(uint32_t)&cap_buf[CAP_BUF_LEN], Mode_Single);
|
||||||
|
TMR3_ITCfg(ENABLE, TMR0_3_IT_DMA_END); // 开启DMA完成中断
|
||||||
|
PFIC_EnableIRQ(TMR3_IRQn);
|
||||||
|
|
||||||
|
logDebug("VavleDect_Start");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 一个数组中,去掉最大最小值,计算平均值
|
||||||
|
uint16_t VavleDect_CalFreq(uint16_t freq_arr[], uint8_t n)
|
||||||
|
{
|
||||||
|
if (freq_arr == NULL || n <= 2)
|
||||||
|
{
|
||||||
|
logError("数组太小或为空,无法去除最大最小值");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t min, max;
|
||||||
|
double average = 0;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
average += freq_arr[i];
|
||||||
|
if (i == 0)
|
||||||
|
{
|
||||||
|
min = freq_arr[i];
|
||||||
|
max = freq_arr[i];
|
||||||
|
}
|
||||||
|
min = ((min > freq_arr[i]) ? freq_arr[i] : min); // 软件滤波
|
||||||
|
max = ((max < freq_arr[i]) ? freq_arr[i] : max);
|
||||||
|
}
|
||||||
|
logDebug("min = %d, max = %d", min, max);
|
||||||
|
average = (average - min - max) / (CAP_BUF_LEN - 2);
|
||||||
|
|
||||||
|
return (uint16_t)average;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t VavleDect_GetFreq(void)
|
||||||
|
{
|
||||||
|
uint16_t freq = 0;
|
||||||
|
if (cap_flag == 0)
|
||||||
|
{
|
||||||
|
TMR3_ITCfg(DISABLE, TMR0_3_IT_DMA_END); // 使用单次DMA功能+中断,注意完成后关闭此中断使能,否则会一直上报中断。
|
||||||
|
TMR3_ClearITFlag(TMR0_3_IT_DMA_END); // 清除中断标志
|
||||||
|
logError("cap err");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
cap_flag = 0;
|
||||||
|
uint16_t t[CAP_BUF_LEN] = {0};
|
||||||
|
uint16_t f[CAP_BUF_LEN] = {0};
|
||||||
|
for (uint8_t i = 0; i < CAP_BUF_LEN; i++)
|
||||||
|
{
|
||||||
|
// logDebug("%08ld ", cap_buf[i] & 0x1ffffff); // 26bit, 最高位表示 高电平还是低电平
|
||||||
|
t[i] = ((cap_buf[i] & 0x1ffffff) * 1.0f) / FREQ_SYS * 1000000;
|
||||||
|
f[i] = 1000000 / t[i];
|
||||||
|
logDebug("T = %04d us, f = %04d Hz", t[i], f[i]);
|
||||||
|
BSP_UART1_TxLoop();
|
||||||
|
}
|
||||||
|
freq = VavleDect_CalFreq(&f[0], CAP_BUF_LEN);
|
||||||
|
|
||||||
|
return freq;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VavleDect_Switch(void)
|
||||||
|
{
|
||||||
|
if (valve_switch_freq == 0)
|
||||||
|
{
|
||||||
|
gValveData.switch_status = kDisconnect;
|
||||||
|
logError("valve_switch_freq err");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (valve_switch_freq >= (valve_switch_off_freq - 100))
|
||||||
|
{
|
||||||
|
gValveData.switch_status = kOpened;
|
||||||
|
logDebug("valve_switch_on");
|
||||||
|
}
|
||||||
|
else if (valve_switch_freq <= (valve_switch_on_freq + 100))
|
||||||
|
{
|
||||||
|
gValveData.switch_status = kClosed;
|
||||||
|
logDebug("valve_switch_off");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/**
|
/**
|
||||||
* @description: 从接收缓冲区中获取一帧有效数据
|
* @description: 从接收缓冲区中获取一帧有效数据
|
||||||
|
@ -342,10 +451,20 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events)
|
||||||
|
|
||||||
BSP_BlockSleep();
|
BSP_BlockSleep();
|
||||||
BSP_RequestBoost();
|
BSP_RequestBoost();
|
||||||
DelayMs(1);
|
DelayUs(200);
|
||||||
|
|
||||||
// EMV_CHARGE
|
// EMV_CHARGE
|
||||||
|
// EMV_CHARGE_EN;
|
||||||
|
// DelayUs(500);
|
||||||
|
// EMV_CHARGE_OFF_DEINIT;
|
||||||
|
// DelayUs(200);
|
||||||
|
|
||||||
|
// DelayUs(500);
|
||||||
|
// EMV_CHARGE_OFF_DEINIT;
|
||||||
|
// DelayUs(200);
|
||||||
|
|
||||||
EMV_CHARGE_EN;
|
EMV_CHARGE_EN;
|
||||||
|
|
||||||
logDebug("EMV_CHARGE_EN");
|
logDebug("EMV_CHARGE_EN");
|
||||||
|
|
||||||
// 开始一个定时event,1s后产生,当前语句只会产生一次event
|
// 开始一个定时event,1s后产生,当前语句只会产生一次event
|
||||||
|
@ -415,19 +534,69 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events)
|
||||||
logDebug("VAVLE_CLOSE_END_EVT");
|
logDebug("VAVLE_CLOSE_END_EVT");
|
||||||
return (events ^ VAVLE_CLOSE_END_EVT);
|
return (events ^ VAVLE_CLOSE_END_EVT);
|
||||||
}
|
}
|
||||||
|
// 开始测量电磁铁电感
|
||||||
|
if (events & VAVLE_DECT_SWITCH_START_EVT)
|
||||||
|
{
|
||||||
|
valve_switch_dect_flag = 0;
|
||||||
|
logDebug("VAVLE_DECT_SWITCH_START_EVT");
|
||||||
|
VavleDect_Start();
|
||||||
|
tmos_start_task(vavle_task_id, VAVLE_DECT_SWITCH_END_EVT, MS1_TO_SYSTEM_TIME(10));
|
||||||
|
return (events ^ VAVLE_DECT_SWITCH_START_EVT);
|
||||||
|
}
|
||||||
|
if (events & VAVLE_DECT_SWITCH_END_EVT)
|
||||||
|
{
|
||||||
|
logDebug("VAVLE_DECT_SWITCH_END_EVT");
|
||||||
|
|
||||||
|
valve_switch_freq = VavleDect_GetFreq();
|
||||||
|
logDebug("valve_switch_freq = 04%d Hz", valve_switch_freq);
|
||||||
|
VavleDect_Switch();
|
||||||
|
valve_switch_dect_flag = 1;
|
||||||
|
|
||||||
|
// logDebug("LED显示状态");
|
||||||
|
// // tmos_set_event(led_task_id, LED_SHOW_START_EVT);
|
||||||
|
// BSP_BlockSleep();
|
||||||
|
// BSP_RequestBoost();
|
||||||
|
// DelayMs(1);
|
||||||
|
// ShowLed();
|
||||||
|
|
||||||
|
return (events ^ VAVLE_DECT_SWITCH_END_EVT);
|
||||||
|
}
|
||||||
|
if (events & VAVLE_DECT_SWITCH_CALIB_EVT)
|
||||||
|
{
|
||||||
|
logDebug("VAVLE_DECT_SWITCH_CALIB_EVT");
|
||||||
|
|
||||||
|
return (events ^ VAVLE_DECT_SWITCH_CALIB_EVT);
|
||||||
|
}
|
||||||
|
|
||||||
if (events & VAVLE_LOW_VBAT_ALARM_EVT)
|
if (events & VAVLE_LOW_VBAT_ALARM_EVT)
|
||||||
{
|
{
|
||||||
logDebug("VAVLE_LOW_VBAT_ALARM_EVT");
|
logDebug("VAVLE_LOW_VBAT_ALARM_EVT");
|
||||||
|
|
||||||
tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
|
// BSP_BlockSleep();
|
||||||
|
// BSP_RequestBoost();
|
||||||
|
|
||||||
|
// LED_ALL_OFF_DEINIT;
|
||||||
|
// LED_Y_ON;
|
||||||
|
|
||||||
|
// BEEP_ON;
|
||||||
|
|
||||||
|
// DelayMs(10);
|
||||||
|
|
||||||
|
// LED_ALL_OFF_DEINIT;
|
||||||
|
// BEEP_OFF_DEINIT;
|
||||||
|
|
||||||
|
// BSP_NoNeedBoost();
|
||||||
|
// BSP_RequestSleep();
|
||||||
|
|
||||||
|
// tmos_set_event(vavle_task_id, VAVLE_CLOSE_START_EVT);
|
||||||
|
|
||||||
// tmos_start_task(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT, MS1_TO_SYSTEM_TIME(VALVE_LOW_VBAT_ALARM_PERIOD_MS));
|
// tmos_start_task(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT, MS1_TO_SYSTEM_TIME(VALVE_LOW_VBAT_ALARM_PERIOD_MS));
|
||||||
|
|
||||||
return (events ^ VAVLE_LOW_VBAT_ALARM_EVT);
|
return (events ^ VAVLE_LOW_VBAT_ALARM_EVT);
|
||||||
}
|
}
|
||||||
if (events & VAVLE_DECT_EVT)
|
if (events & VAVLE_LOOP_DECT_EVT)
|
||||||
{
|
{
|
||||||
logDebug("VAVLE_DECT_EVT");
|
logDebug("VAVLE_LOOP_DECT_EVT");
|
||||||
|
|
||||||
gValveData.bat = BSP_ReadVbat();
|
gValveData.bat = BSP_ReadVbat();
|
||||||
|
|
||||||
|
@ -441,9 +610,9 @@ static uint16_t VAVLE_Task_ProcessEvent(uint8_t task_id, uint16_t events)
|
||||||
{
|
{
|
||||||
tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT);
|
tmos_set_event(vavle_task_id, VAVLE_LOW_VBAT_ALARM_EVT);
|
||||||
}
|
}
|
||||||
tmos_start_task(vavle_task_id, VAVLE_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS));
|
tmos_start_task(vavle_task_id, VAVLE_LOOP_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS));
|
||||||
|
|
||||||
return (events ^ VAVLE_DECT_EVT);
|
return (events ^ VAVLE_LOOP_DECT_EVT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Discard unknown events
|
// Discard unknown events
|
||||||
|
@ -468,7 +637,42 @@ void BSP_VAVLE_Init(void)
|
||||||
// //立即开始一个event
|
// //立即开始一个event
|
||||||
// tmos_set_event(vavle_task_id, VAVLE_RX_DATA_EVT);
|
// tmos_set_event(vavle_task_id, VAVLE_RX_DATA_EVT);
|
||||||
|
|
||||||
tmos_start_task(vavle_task_id, VAVLE_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS));
|
// PA2
|
||||||
|
/* 定时器3,CAP捕捉, */
|
||||||
|
GPIOA_ResetBits(GPIO_Pin_2);
|
||||||
|
GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PU);
|
||||||
|
|
||||||
|
// TMR3功能引脚映射选择位:
|
||||||
|
// 1:TMR3_/PWM3_/CAP3_映射到PA[2];
|
||||||
|
R16_PIN_ALTERNATE |= (1 << 3);
|
||||||
|
|
||||||
|
TMR3_CapInit(FallEdge_To_FallEdge);
|
||||||
|
// (1 / 62.4MHz) * 2的26次方 = 0.01602564102564102564102564102564 us * 67108864 约等于 1.0754625641025641025641025641025 S
|
||||||
|
// TMR3_CAPTimeoutCfg(FREQ_SYS ); // 设置捕捉超时时间
|
||||||
|
TMR3_CAPTimeoutCfg(GetSysClock() / 100); // 设置捕捉超时时间 10ms
|
||||||
|
|
||||||
|
tmos_start_task(vavle_task_id, VAVLE_LOOP_DECT_EVT, MS1_TO_SYSTEM_TIME(VALVE_DECT_PERIOD_MS));
|
||||||
|
|
||||||
logInfo("BSP_Valve_Init");
|
logInfo("BSP_Valve_Init");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
* @fn TMR3_IRQHandler
|
||||||
|
*
|
||||||
|
* @brief TMR3中断函数
|
||||||
|
*
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
__INTERRUPT
|
||||||
|
__HIGH_CODE
|
||||||
|
void TMR3_IRQHandler(void) // TMR3 定时中断
|
||||||
|
{
|
||||||
|
if (TMR3_GetITFlag(TMR0_3_IT_DMA_END))
|
||||||
|
{
|
||||||
|
TMR3_ITCfg(DISABLE, TMR0_3_IT_DMA_END); // 使用单次DMA功能+中断,注意完成后关闭此中断使能,否则会一直上报中断。
|
||||||
|
TMR3_ClearITFlag(TMR0_3_IT_DMA_END); // 清除中断标志
|
||||||
|
cap_flag = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue