This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
CMS3in1/1.Cabin/4.MISC/断线监测/OfflineDetection/Drivers/BSP/cd4051b/cd4051b.c

184 lines
6.4 KiB
C
Raw Permalink Normal View History

#include "./BSP/cd4051b/cd4051b.h"
#include "./SYSTEM/adc/adc.h"
#include "./SYSTEM/delay/delay.h"
#include "stdbool.h"
#include <stdint.h>
//gpio初始化程序
void CD4051B_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOE, Config_A1_Pin|Config_B1_Pin|Config_C1_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOE, Config_INH1_Pin|Config_INH2_Pin, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(Config_A2_GPIO_Port, Config_A2_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOF, Config_B2_Pin|Config_C2_Pin, GPIO_PIN_RESET);
/*CD4051B_1 A/B/C选择脚*/
GPIO_InitStruct.Pin = Config_A1_Pin|Config_B1_Pin|Config_C1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*INH1CD4051B_1控制脚*/
/*INH2CD4051B_2控制脚*/
GPIO_InitStruct.Pin = Config_INH1_Pin|Config_INH2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*CD4051B_2 A选择脚 */
GPIO_InitStruct.Pin = Config_A2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(Config_A2_GPIO_Port, &GPIO_InitStruct);
/*D4051B_2 B/C选择脚*/
GPIO_InitStruct.Pin = Config_B2_Pin|Config_C2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
//控制CD4051B开关
void Control_CD4051B(bool flag_1, bool flag_2){
// 控制CD4051B开启或关闭 True开启False关闭
HAL_GPIO_WritePin(GPIOE, Config_INH1_Pin, flag_1 ? GPIO_PIN_RESET : GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE, Config_INH2_Pin, flag_2 ? GPIO_PIN_RESET : GPIO_PIN_SET);
}
//选择CD4051B输出引脚
void CD4051B_Pin_Select(int Slice, int Piece){
if(Slice == 1){
Control_CD4051B(true, false); // 开启CD4051B
// 根据Piece的值设置引脚状态
HAL_GPIO_WritePin(GPIOE, Config_A1_Pin | Config_B1_Pin | Config_C1_Pin, GPIO_PIN_RESET); // 重置所有引脚状态
switch(Piece){
case 1:
break; // A1 B1 C1 都保持低电平
case 2:
HAL_GPIO_WritePin(GPIOE, Config_A1_Pin, GPIO_PIN_SET);
break; // A1 为高电平B1 C1 为低电平
case 3:
HAL_GPIO_WritePin(GPIOE, Config_B1_Pin, GPIO_PIN_SET);
break; // B1 为高电平A1 C1 为低电平
case 4:
HAL_GPIO_WritePin(GPIOE, Config_A1_Pin | Config_B1_Pin, GPIO_PIN_SET);
break; // A1 B1 为高电平C1 为低电平
case 5:
HAL_GPIO_WritePin(GPIOE, Config_C1_Pin, GPIO_PIN_SET);
break; // C1 为高电平A1 B1 为低电平
case 6:
HAL_GPIO_WritePin(GPIOE, Config_A1_Pin | Config_C1_Pin, GPIO_PIN_SET);
break; // A1 C1 为高电平B1 为低电平
case 7:
HAL_GPIO_WritePin(GPIOE, Config_B1_Pin | Config_C1_Pin, GPIO_PIN_SET);
break; // B1 C1 为高电平A1 为低电平
case 8:
HAL_GPIO_WritePin(GPIOE, Config_A1_Pin | Config_B1_Pin | Config_C1_Pin, GPIO_PIN_SET);
break; // A1 B1 C1 都为高电平
default:
break;
}
}
if(Slice == 2){
Control_CD4051B(false, true); // 开启CD4051B
// 根据Piece的值设置引脚状态
HAL_GPIO_WritePin(Config_A2_GPIO_Port, Config_A2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOF, Config_C2_Pin | Config_B2_Pin, GPIO_PIN_RESET); // 重置所有引脚状态
switch(Piece){
case 1:
break; // A2 B2 C2 都保持低电平
case 2:
HAL_GPIO_WritePin(Config_A2_GPIO_Port, Config_A2_Pin, GPIO_PIN_SET);
break; // A2 为高电平B2 C2 为低电平
case 3:
HAL_GPIO_WritePin(GPIOF, Config_B2_Pin, GPIO_PIN_SET);
break; // B2 为高电平A2 C2 为低电平
case 4:
HAL_GPIO_WritePin(GPIOF, Config_B2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(Config_A2_GPIO_Port, Config_A2_Pin, GPIO_PIN_SET);
break; // B2 A2 为高电平C2 为低电平
case 5:
HAL_GPIO_WritePin(GPIOF, Config_C2_Pin, GPIO_PIN_SET);
break; // C2 为高电平A2 B2 为低电平
case 6:
HAL_GPIO_WritePin(Config_A2_GPIO_Port, Config_A2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOF, Config_C2_Pin, GPIO_PIN_SET);
break; // A2 C2 为高电平B2 为低电平
case 7:
HAL_GPIO_WritePin(GPIOF, Config_B2_Pin | Config_C2_Pin, GPIO_PIN_SET);
break; // B2 C2 为高电平A2 为低电平
case 8:
HAL_GPIO_WritePin(Config_A2_GPIO_Port, Config_A2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOF, Config_B2_Pin | Config_C2_Pin, GPIO_PIN_SET);
break; // A2 B2 C2 都为高电平
default:
break;
}
}
// Control_CD4051B(false, false); // 关闭CD4051B
}
DetectionResults OffLineDetection(void) {
uint8_t OffLineDetectionResult1 = 0;
uint8_t OffLineDetectionResult2 = 0;
int Slice = 1, Piece = 1;
for(Slice = 1; Slice<3; Slice++)
{
for(Piece = 1; Piece<9; Piece++){
CD4051B_Pin_Select(Slice, Piece); //开启相应监测通道
delay_ms(100);
if(Slice==1){
int adcx = adc_get_result_average(9, 10); //获取通道9的转换值10次取平均
// float temp = adcx*(2.5 / 256);
// printf("1:%d\r\n",Piece);
// printf("V:%f\r\n",temp);
if((adcx*(2.5 / 256))>1.7){
OffLineDetectionResult1 = OffLineDetectionResult1 | (0x1 << (8 - Piece)); //如果电压为高代表传感器完好将其置位为1
}
}
if(Slice==2){
int adcx = adc_get_result_average(14, 10); //获取通道14的转换值10次取平均
// float temp = adcx*(2.5 / 256);
// printf("2:%d\r\n",Piece);
// printf("V:%f\r\n",temp);
if((adcx*(2.5 / 256))>1.7){
OffLineDetectionResult2 = OffLineDetectionResult2 | (0x1 << (8 - Piece)); //如果电压为高代表传感器完好将其置位为1
}
}
}
}
DetectionResults results = {OffLineDetectionResult1, OffLineDetectionResult2};
return results;
}