STM32学习日记--Day5--AD模数转换

接线图:

 main函数:

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

uint16_t ADValue;
float Voltage;

int main(void)
{
	OLED_Init();
	AD_Init();
	
	OLED_ShowString(1, 1, "ADValue:");
	OLED_ShowString(2, 1, "Volatge:0.00V");
	
	while (1)
	{
		ADValue = AD_GetValue();
		Voltage = (float)ADValue / 4095 * 3.3;
		
		OLED_ShowNum(1, 9, ADValue, 4);
		OLED_ShowNum(2, 9, Voltage, 1);
		OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2);
		
		Delay_ms(100);
	}
}

 ADC.C:

#include "stm32f10x.h"                  // Device header

void AD_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);

	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
	
	ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	ADC_InitStructure.ADC_NbrOfChannel = 1;
	ADC_Init(ADC1, &ADC_InitStructure);
	
	ADC_Cmd(ADC1, ENABLE);
	
	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);
}

uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
	return ADC_GetConversionValue(ADC1);
}

`RCC_APB2PeriphClockCmd` 和 `RCC_ADCCLKConfig` 是两个不同的函数,它们在功能和用途上有所区别。

1. `RCC_APB2PeriphClockCmd` 函数:
   - 功能:用于使能或禁用特定外设(如定时器、串口等)的时钟。
   - 用途:通过调用该函数,可以控制外设的时钟使能状态,从而启用或禁用外设的功能。
   - 函数原型:
     ```c
     void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
     ```
   - 参数:
     - `RCC_APB2Periph`:指定要操作的外设的时钟掩码。可以是多个外设的掩码的按位或运算结果。
     - `NewState`:指定要设置的时钟状态,可以是 `ENABLE`(使能)或 `DISABLE`(禁用)。

2. `RCC_ADCCLKConfig` 函数:
   - 功能:用于配置 ADC 的时钟源。
   - 用途:通过调用该函数,可以选择合适的时钟源并将其配置给 ADC,以控制 ADC 的工作频率和精度。
   - 函数原型:
     ```c
     void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK);
     ```
   - 参数:
     - `RCC_ADCCLK`:指定 ADC 的时钟源,可以是预定义的时钟源常量之一。

总结:
- `RCC_APB2PeriphClockCmd` 用于控制外设的时钟使能状态,以启用或禁用外设的功能。
- `RCC_ADCCLKConfig` 用于配置 ADC 的时钟源,以控制 ADC 的工作频率和精度。

这两个函数的使用场景和目的是不同的,但它们都与时钟控制有关,用于配置和控制不同的硬件模块。简单来说就是前一个函数开启使能,后一个用于具体配置。

`ADC_RegularChannelConfig` 是一个函数,用于配置 ADC 的常规转换通道。

在 STM32 微控制器中,ADC 可以进行多个通道的模拟信号转换。`ADC_RegularChannelConfig` 函数用于指定 ADC 的常规转换通道,以便在转换期间依次采样这些通道。

以下是 `ADC_RegularChannelConfig` 函数的示例代码片段:

```c
// 配置 ADC1 的常规转换通道为通道 1,采样时间为 55.5 周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
```

在上面的示例中,我们使用 `ADC_RegularChannelConfig` 函数配置了 ADC1 的常规转换通道。具体参数的含义如下:

- `ADC1`:指定要配置的 ADC 模块。
- `ADC_Channel_1`:指定要配置的转换通道。这里选择的是通道 1,表示采样的模拟信号将来自 ADC1 的通道 1。
- `1`:指定转换序列的序号。对于常规转换,可以选择 1 到 16 之间的任意值。这里选择的是 1,表示这是转换序列中的第一个通道。
- `ADC_SampleTime_55Cycles5`:指定采样时间。这里选择的是 55.5 周期的采样时间。

通过上述代码片段,我们配置了 ADC1 的常规转换通道为通道 1,采样时间为 55.5 周期。这样,当进行 ADC 转换时,ADC1 将按照这个配置依次采样通道 1 上的模拟信号。

需要注意的是,对于多个通道的转换,你可以按照需要多次调用 `ADC_RegularChannelConfig` 函数来配置不同的通道。在配置完成后,可以使用 ADC 的转换触发函数来启动转换过程。

总结:
- `ADC_RegularChannelConfig` 用于配置 ADC 的常规转换通道。
- 通过指定 ADC 模块、转换通道、序号和采样时间,可以配置 ADC 的常规转换通道。

`ADC_Init` 是一个函数,用于初始化 ADC 模块的配置。

在 STM32 微控制器中,ADC 模块需要进行一些基本的配置才能正常工作,例如设置转换分辨率、转换模式、采样时间等。`ADC_Init` 函数用于将这些配置应用到 ADC 模块。

以下是一个使用 `ADC_Init` 函数的示例代码片段:

```c
ADC_InitTypeDef ADC_InitStructure;

// 配置 ADC1 的基本参数
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; // 设置转换分辨率为 12 位
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 启用连续转换模式
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; // 禁用外部触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; // 扫描方向从上到下

// 应用配置到 ADC1
ADC_Init(ADC1, &ADC_InitStructure);
```

在上面的示例中,我们首先定义了一个名为 `ADC_InitStructure` 的结构体变量,用于保存 ADC 的配置参数。然后,我们设置了一些基本的 ADC 配置参数,例如转换分辨率、连续转换模式、外部触发转换等。最后,我们调用 `ADC_Init` 函数,将配置应用到 ADC1。

通过上述代码片段,我们初始化了 ADC1 模块的基本配置。这样,ADC1 将按照这些配置进行模拟信号转换。

需要注意的是,具体的配置参数和选项可能会根据使用的 STM32 系列和库版本而有所不同。在实际使用中,请参考相关的文档和参考资料以获取准确的函数信息。

总结:
- `ADC_Init` 用于初始化 ADC 模块的配置。
- 通过设置 ADC_InitTypeDef 结构体变量的成员来配置 ADC 的基本参数,然后调用 `ADC_Init` 函数将配置应用到 ADC 模块。

请注意,以上示例仅用于说明该函数的一般用法。在实际使用中,请参考相关的文档和参考资料以获取准确的函数信息。

ADC_Cmd 是一个函数,用于使能或禁用 ADC 模块。

在 STM32 微控制器中,ADC 模块需要在使用之前进行使能操作,以便开始进行模拟信号转换。ADC_Cmd 函数用于控制 ADC 模块的使能状态。

以下是 ADC_Cmd 函数的示例代码片段:

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

在上面的示例中,我们使用 ADC_Cmd 函数使能了 ADC1 模块。ADC1 是要使能的 ADC 模块的指针,ENABLE 是一个宏定义,表示使能 ADC 模块。

通过上述代码片段,我们使能了 ADC1 模块,这样它就可以开始进行模拟信号转换了。

如果需要禁用 ADC 模块,可以将第二个参数设置为 DISABLE,如下所示:

// 禁用 ADC1
ADC_Cmd(ADC1, DISABLE);

通过上述代码片段,我们禁用了 ADC1 模块,停止了模拟信号转换。

总结:

  • ADC_Cmd 用于使能或禁用 ADC 模块。
  • 通过指定 ADC 模块的指针和使能状态,可以控制 ADC 模块的使能状态。

	ADC_ResetCalibration(ADC1);
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);
	ADC_StartCalibration(ADC1);
	while (ADC_GetCalibrationStatus(ADC1) == SET);

首先,`ADC_ResetCalibration` 函数用于对 ADC 进行校准重置。该函数的作用是将 ADC 的校准寄存器重置为默认值。

接下来,使用 `ADC_GetResetCalibrationStatus` 函数等待校准重置完成。该函数返回的状态为 `SET` 表示校准重置还未完成,需要继续等待。

一旦校准重置完成,就可以使用 `ADC_StartCalibration` 函数开始进行校准。该函数会自动执行 ADC 的校准过程。

然后,使用 `ADC_GetCalibrationStatus` 函数等待校准过程完成。该函数返回的状态为 `SET` 表示校准过程还未完成,需要继续等待。

下面是完整的代码片段:

```c
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1) == SET);
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1) == SET);
```

通过以上代码片段,我们完成了 ADC 的校准过程。在校准完成后,ADC 就可以正常进行模拟信号转换了。

需要注意的是,校准过程的具体步骤和状态检查函数可能会根据使用的 STM32 系列和库版本而有所不同。在实际使用中,请参考相关的文档和参考资料以获取准确的函数信息。

总结:
- 使用 `ADC_ResetCalibration` 函数对 ADC 进行校准重置。
- 使用 `ADC_GetResetCalibrationStatus` 函数等待校准重置完成。
- 使用 `ADC_StartCalibration` 函数开始进行校准。
- 使用 `ADC_GetCalibrationStatus` 函数等待校准过程完成。

uint16_t AD_GetValue(void)
{
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    return ADC_GetConversionValue(ADC1);
}

上述代码片段展示了一个名为 `AD_GetValue` 的函数,用于获取 ADC 的转换值。

该函数的主要步骤如下:

1. 使用 `ADC_SoftwareStartConvCmd` 函数启动 ADC 的软件转换。这会触发 ADC 开始进行模拟信号的转换。

2. 使用 `ADC_GetFlagStatus` 函数等待 ADC 转换完成。该函数检查 ADC 的转换完成标志位(`ADC_FLAG_EOC`),如果标志位为 `RESET`,表示转换还未完成,需要继续等待。

3. 一旦转换完成,使用 `ADC_GetConversionValue` 函数获取 ADC 的转换值。该函数返回 ADC 的转换结果,以 `uint16_t` 类型表示。

4. 最后,将获取到的转换值作为函数的返回值返回。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值