#include "./BSP/cd4051b/cd4051b.h" #include "./SYSTEM/adc/adc.h" #include "./SYSTEM/delay/delay.h" #include "stdbool.h" #include //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); //开启相应监测通道 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; }