183 lines
6.4 KiB
C
183 lines
6.4 KiB
C
![]() |
#include "./BSP/cd4051b/cd4051b.h"
|
|||
|
#include "./SYSTEM/adc/adc.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);
|
|||
|
|
|||
|
/*INH1:CD4051B_1控制脚*/
|
|||
|
/*INH2:CD4051B_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); //开启相应监测通道
|
|||
|
HAL_Delay(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;
|
|||
|
}
|