原理圖:
擴展模塊原理圖:
RP1和RP2分別對應著AIN1和AIN2,扭動它們,其對應滑動變阻器阻值也會變化
實驗板接口原理圖:
對應實驗板接口PB1和PB0
即AN1對應PB1, AN2對應PB0
CubMx配置:
ADC通道IN8和IN9才對應PB0和PB1
keil配置:
Function:
#include "Function.h"
#include "i2c.h"
#include "oled.h"
#include <stdint.h>
#include "adc.h"void OLED_Write(unsigned char type, unsigned char data){unsigned char Write_Data[2];Write_Data[0] = type;Write_Data[1] = data;HAL_I2C_Master_Transmit(&hi2c3, 0x78, Write_Data, 2, 0xff);
}void Function_OledEnable(unsigned char ms){HAL_GPIO_WritePin(OLED_POWER_GPIO_Port, OLED_POWER_Pin, GPIO_PIN_RESET);HAL_Delay(ms);OLED_Init();
}float* Function_GetAdc(unsigned char ms){uint16_t adc_data[2]; // 獲取原始值static float adc_Value[3]; // 轉化成浮點值for(unsigned char i = 0; i < 2; i ++){HAL_ADC_Start(&hadc); // 開啟HAL_ADC_PollForConversion(&hadc, 0xff); // 等待ADC轉換完成adc_data[i] = HAL_ADC_GetValue(&hadc);adc_Value[i] = ((float)adc_data[i]) * 3.30f/4095;HAL_Delay(ms); // 提高精度}HAL_ADC_Stop(&hadc); // 停止轉換adc_Value[2] = adc_Value[1];adc_Value[1] = adc_Value[0];adc_Value[0] = adc_Value[2]; // 將0, 1的值調換一下return adc_Value;
}
#ifndef __FUNCTION__
#define __FUNCTION__void OLED_Write(unsigned char type, unsigned char data);
void Function_OledEnable(unsigned char ms);
float* Function_GetAdc(unsigned char ms);
#endif
main:
#include "main.h"
#include "adc.h"
#include "i2c.h"
#include "gpio.h"
#include "Function.h"
#include "oled.h"void SystemClock_Config(void);int main(void)
{float * AdcGet;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_ADC_Init();MX_I2C3_Init();Function_OledEnable(50);while (1){AdcGet = Function_GetAdc(10); // 獲取ADCOLED_ShowNumber(0, 0, (uint32_t) (AdcGet[0] + 0.5), 2, 16);OLED_ShowNumber(0, 2, (uint32_t) (AdcGet[1] + 0.5), 2, 16);}}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C3;PeriphClkInit.I2c3ClockSelection = RCC_I2C3CLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}void Error_Handler(void)
{__disable_irq();while (1){}}
效果:
拓展:
Discontinuous Conversion Mode"是指在模數轉換器(ADC)中的一種工作模式。在這種模式下,ADC只有在觸發條件滿足時才會進行轉換,而不是連續地進行轉換。
在"Discontinuous Conversion Mode"中,ADC會在每個觸發事件(比如定時器溢出、外部觸發等)發生時進行一次轉換。這種模式適用于需要節省能量或者只在特定事件發生時才需要轉換的應用場景。在這種模式下,ADC會在完成轉換后自動進入低功耗模式,直到下一個觸發事件發生。
這種模式的工作原理在不同的微控制器或者ADC芯片上可能會有所不同,因此具體的工作方式需要參考相應的數據手冊或者技術文檔。
3.3f表示數據為float類型單精度,3.3默認數據為double類型雙精度