ad 模电转换


时间: 2023/10/2

今天下午 会去看电影

很舒服

简介

工作模式


每次要转换的时候 需要触发一次

触发一次后 就不需要再次触发了

数据对齐

数据右对齐常用

数据左对齐用于数据精度不那么高的场合

取高8位 来实现对数据的读取

校准

转换时间

代码的结构

// 1. 开启rcc时钟(RCC clk也要配置)
// 2. 配置 GPIO 3. 配置多路开关 4. 配置ADC转换器
// 5. 开启开关控制

see see 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "stm32f10x.h"                  // Device header

void AD_init(void)
{
// 1. 开启rcc时钟(RCC clk也要配置)
// 2. 配置 GPIO 3. 配置多路开关 4. 配置ADC转换器
// 5. 开启开关控制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72\6

// 配置GPIOA
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);
// 配置多路开关
// 在序列1的位置 写入通道0
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
// 配置adc
ADC_InitTypeDef ADC1_InitStruct;
ADC1_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
// 配置非连续单次工作模式
ADC1_InitStruct.ADC_ContinuousConvMode = ENABLE;
// 这个数据定义了触发模式
ADC1_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
// 工作模式
ADC1_InitStruct.ADC_Mode = ADC_Mode_Independent;
ADC1_InitStruct.ADC_NbrOfChannel = 1;
ADC1_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1, &ADC1_InitStruct);
// 上电
ADC_Cmd(ADC1, ENABLE);
// 上电校准
// 配置校准 1. 校准寄存器 2. 校准状态
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1)== SET);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1) == SET);
// 连续转换模式下 只需要触发一次就可以了
// 这里是触发源 设置为软件触发
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

uint16_t AD_GetValue(void)
{
// while 没给个; 导致代码一直出bug
// 这里实在是太愚蠢了
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}

注意注意

  1. 注意while 后面;的小细节
  2. voltage = (float)AD_value /4095 * 3.3; ad_value 作为整数 除以整数 输出也是个整数 所以这里需要强行数据转换成浮点数