STM32项目实战:ADC采集

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "stdlib.h"


int adc_value;
float voltage;
u8 buff[30];
/**
  * 坐标轴定义:
  * 左上角为(0, 0)点
  * 横向向右为X轴,取值范围:0~127
  * 纵向向下为Y轴,取值范围:0~63
  * 
  *       0             X轴           127 
  *      .------------------------------->
  *    0 |
  *      |
  *      |
  *      |
  *  Y轴 |
  *      |
  *      |
  *      |
  *   63 |
  *      v
  * 
  */

// 初始化水泵ADC
void ADC_Init_Config(void)
{
    ADC_InitTypeDef ADC;
    GPIO_InitTypeDef GPIO;

    // 使能ADC1和GPIOB时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE);

    // 配置PB0为模拟输入模式
    GPIO.GPIO_Pin = GPIO_Pin_0;
    GPIO.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOB, &GPIO);

    // 配置ADC1
    ADC.ADC_Mode = ADC_Mode_Independent;
    ADC.ADC_ScanConvMode = DISABLE;
    ADC.ADC_ContinuousConvMode = DISABLE;
    ADC.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC.ADC_DataAlign = ADC_DataAlign_Right;
    ADC.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC);

    // 配置ADC1的通道8(PB0),采样时间为1.5周期
    ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_1Cycles5);

    // 使能ADC1
    ADC_Cmd(ADC1, ENABLE);

    // 初始化ADC校准值
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1));
}

int main(void)
{
	ADC_Init_Config();
	
	/*OLED初始化*/
	OLED_Init();
	
	/*在(0, 0)位置显示字符'A',字体大小为8*16点阵*/
	OLED_ShowChar(0, 0, 'A', OLED_8X16);
	
	/*在(16, 0)位置显示字符串"Hello World!",字体大小为8*16点阵*/
	OLED_ShowString(16, 0, "Hello World!", OLED_8X16);
	
	/*在(0, 18)位置显示字符'A',字体大小为6*8点阵*/
	OLED_ShowChar(0, 18, 'A', OLED_6X8);
	
	/*在(16, 18)位置显示字符串"Hello World!",字体大小为6*8点阵*/
	OLED_ShowString(16, 18, "Hello World!", OLED_6X8);
	
	/*在(0, 28)位置显示数字12345,长度为5,字体大小为6*8点阵*/
	OLED_ShowNum(0, 28, 12345, 5, OLED_6X8);
	
	/*在(40, 28)位置显示有符号数字-66,长度为2,字体大小为6*8点阵*/
	OLED_ShowSignedNum(40, 28, -66, 2, OLED_6X8);
	
	/*在(70, 28)位置显示十六进制数字0xA5A5,长度为4,字体大小为6*8点阵*/
	OLED_ShowHexNum(70, 28, 0xA5A5, 4, OLED_6X8);
	
	/*在(0, 38)位置显示二进制数字0xA5,长度为8,字体大小为6*8点阵*/
	OLED_ShowBinNum(0, 38, 0xA5, 8, OLED_6X8);
	
	/*在(60, 38)位置显示浮点数字123.45,整数部分长度为3,小数部分长度为2,字体大小为6*8点阵*/
	OLED_ShowFloatNum(60, 38, 123.45, 3, 2, OLED_6X8);
	
	/*在(0, 48)位置显示汉字串"你好,世界。",字体大小为固定的16*16点阵*/
	OLED_ShowChinese(0, 48, "你好,世界。");
	
	/*在(96, 48)位置显示图像,宽16像素,高16像素,图像数据为Diode数组*/
	OLED_ShowImage(96, 48, 16, 16, Diode);
	
	/*在(96, 18)位置打印格式化字符串,字体大小为6*8点阵,格式化字符串为"[%02d]"*/
	OLED_Printf(96, 18, OLED_6X8, "[%02d]", 6);
	
	/*调用OLED_Update函数,将OLED显存数组的内容更新到OLED硬件进行显示*/
	OLED_Update();
	
	/*延时3000ms,观察现象*/
	Delay_ms(3000);
	
	/*清空OLED显存数组*/
	OLED_Clear();

	
	while (1)
	{

		        // 启动ADC转换
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);

        // 等待转换完成
        while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

        // 获取ADC转换结果
        adc_value = ADC_GetConversionValue(ADC1);

        // 计算电压值
        // STM32F103C8T6的ADC分辨率是12位,参考电压为3.3V
        voltage = (adc_value * 3.3) / 4096;
				sprintf((char*)buff,"%fV  ",voltage);
				OLED_ShowString(16, 18, buff, OLED_6X8);
				OLED_Update();

				
	}
}

你可能感兴趣的:(#,基础,蓝桥杯单片机和嵌入式,#,STM32,stm32,单片机,嵌入式硬件)