目录
首先需要移植官方提供的I2C,参考这篇文章:
MCP驱动函数:
// MCP_write 函数用于向 MCP4017 数字电位器写入数据
void MCP_write(u8 dat)
{
I2CStart(); // 发送起始信号
I2CSendByte(0x5E); // 发送设备地址(写模式)
I2CWaitAck(); // 等待应答信号
I2CSendByte(dat); // 发送要写入的数据
I2CWaitAck(); // 等待应答信号
I2CStop(); // 发送停止信号
}
// MCP_read 函数用于从 MCP4017 数字电位器读取数据
u8 MCP_read()
{
u8 dat;
I2CStart(); // 发送起始信号
I2CSendByte(0x5F); // 发送设备地址(读模式)
I2CWaitAck(); // 等待应答信号
dat = I2CReceiveByte(); // 读取从设备返回的数据
I2CSendNotAck(); // 发送非应答信号
I2CStop(); // 发送停止信号
return(dat); // 返回读取的数据
}
打开ADC1的对应通道 chanl11对应滑变的ADC,chanle5对应MCP4017的adc通道
将转换通道数Number Of Conversion 从1变为2,产生2个ADC通道,并配置不同通道的检测周期(设为最大),和检测顺序,rank1先与rank2
MCU4017的检测代码:
// ADC_proc 函数用于执行ADC(模数转换器)的数据采集操作
void ADC_proc()
{
//rank1: 开始ADC转换,采集R38的电压值
HAL_ADC_Start(&hadc1); // 启动ADC1通道的转换
volt_r38 = HAL_ADC_GetValue(&hadc1) / 4096.0f * 3.3f; // 获取ADC1转换结果并将其转换为电压值
//rank2: 开始ADC转换,采集MCP的电压值
HAL_ADC_Start(&hadc1); // 再次启动ADC1通道的转换,这里可能是因为需要对两个通道进行连续的数据采集
volt_mcp = HAL_ADC_GetValue(&hadc1) / 4096.0f * 3.3f; // 获取ADC1转换结果并将其转换为电压值
}
主函数:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init(); // 初始化HAL库
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config(); // 配置系统时钟
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init(); // 初始化GPIO外设
MX_ADC1_Init(); // 初始化ADC1外设
// MX_ADC2_Init(); // 初始化ADC2外设,该行被注释掉了
/* USER CODE BEGIN 2 */
LCD_Init(); // LCD初始化
I2CInit(); // I2C总线初始化
start_value = EEP_read(0x30); // 从EEPROM读取数据
EEP_write(0x30, ++start_value); // 向EEPROM写入数据
//MCP4917
MCP_write(0x00); // 向MCP4917写入数据
mcp_value = MCP_read(); // 从MCP4917读取数据
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
LED_Control(0x00); // 控制LED,初始化状态为关闭
LCD_Clear(Blue); // 清屏,设置背景颜色为蓝色
LCD_SetBackColor(Blue); // 设置文本背景颜色为蓝色
LCD_SetTextColor(White); // 设置文本颜色为白色
LCD_proc(); // LCD处理函数
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// LED_proc(); // LED处理函数,该行被注释掉了
// if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 0)
// {
// LED_Control(0x01);
// }
// if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 0)
// {
// LED_Control(0x02);
// }
// KEY_proc(); // 按键处理函数,该行被注释掉了
// HAL_ADC_Start(&hadc2); // 启动ADC2转换,该行被注释掉了
// adc2_value = HAL_ADC_GetValue(&hadc2); // 从ADC2读取转换值,该行被注释掉了
// volt_r37 = adc2_value /4096.0f*3.3; // 计算R37电压值,该行被注释掉了
ADC_proc(); // ADC处理函数,获取ADC转换值并计算电压
LCD_proc(); // LCD处理函数,更新LCD显示
}
/* USER CODE END 3 */
}