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/2.Blade/1.Software/STM32/Drivers/BSP/CD4051B/cd4051b.c

183 lines
6.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
/*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); //开启相应监测通道
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;
}