时间: 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"
void AD_init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, 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 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); 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(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); return ADC_GetConversionValue(ADC1); }
|
注意注意
- 注意while 后面;的小细节
- voltage = (float)AD_value /4095 * 3.3; ad_value 作为整数 除以整数 输出也是个整数 所以这里需要强行数据转换成浮点数