当前位置: 首页 > ops >正文

stm32 ADC单通道转换

stm32c8t6仅有12位分辨率

1、单次转换 非扫描

1、初始化

void Ad_Init()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//配置ADCCLK时钟分频,ADC的输入时钟不得超过14MHzRCC_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_1Cycles5);ADC_InitTypeDef ADC_InitStruct;//独立模式 ADC1 和 ADC2 单独转换ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//选择数据对齐 左对齐、右对齐ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;//外部触发源选择, 这里使用软件触发,所以选择NoneADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//连续转换模式, 选择单次转换还是连续转换ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//扫描转换模式, 选择扫描模式还是非扫描模式ADC_InitStruct.ADC_ScanConvMode=DISABLE;//通道数目, 只有在扫描模式下才能使用多个通道ADC_InitStruct.ADC_NbrOfChannel=1;ADC_Init(ADC1, &ADC_InitStruct);ADC_Cmd(ADC1, ENABLE);//手册中建议在每次上电后执行一次校准//复位校准ADC_ResetCalibration(ADC1);//等待复位校准完成, 复位校准完成后为 RESETwhile(ADC_GetResetCalibrationStatus(ADC1)==SET);//开始校准ADC_StartCalibration(ADC1);//等待校准完成while(ADC_GetCalibrationStatus(ADC1)==SET);}

ADC的复位校准位

2、开始转换

uint16_t AD_GetValue()
{//开始转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);//判断转换是否完成, 转换结束时EOC置1while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET);//取转换结果, 内部代码为读取DR寄存器内容,//读取后会自动清除EOC标志位return ADC_GetConversionValue(ADC1);
}

2、连续转换 非扫描

        

不需要不断地触发,不需要等待转换完成

ADC会连续不断地对指定通道进行转换,把结果放到数据寄存器中

1、初始化

ADC_InitStruct.ADC_ContinuousConvMode=ENABLE;//手册中建议在每次上电后执行一次校准
//复位校准
ADC_ResetCalibration(ADC1);
//等待复位校准完成, 复位校准完成后为 RESET
while(ADC_GetResetCalibrationStatus(ADC1)==SET);
//开始校准
ADC_StartCalibration(ADC1);
//等待校准完成
while(ADC_GetCalibrationStatus(ADC1)==SET);
//连续转换仅需要在最开始触发一次就可以,
//软件触发转换函数可以挪到初始化最后,不需要每次取值都使用
ADC_SoftwareStartConvCmd(ADC1, ENABLE);

2、返回值

连续转换模式下,不需要判断转换完成的标志位,直接返回值就可以

uint16_t AD_GetValue()
{return ADC_GetConversionValue(ADC1);
}

http://www.xdnf.cn/news/6114.html

相关文章:

  • 反射, 注解, 动态代理
  • 【PSINS工具箱】基于工具箱的单独GNSS导航、单独INS导航、两者结合组合导航,三种导航的对比程序。附完整的代码
  • 一文理解扩散模型(生成式AI模型)(2)
  • 使用 Docker Desktop 安装 Neo4j 知识图谱
  • VastBase的日常操作记录
  • Qt功能区:简介与安装
  • JS中本地存储(LocalStorage)和会话存储(sessionStorage)的使用和区别
  • vscode - 笔记
  • Deep Learning(手写字识别 - CNN)
  • Python算法思想
  • 企业级IP代理解决方案:负载均衡与API接口集成实践
  • 【导航信号模拟器】【MATLAB APP】MATLAB AppDesigner基本使用教程
  • DA14531如何在固件中生成与时间相关的mac和版本号
  • react+html-docx-js将页面导出为docx
  • 没经过我同意,flink window就把数据存到state里的了?
  • Java 大视界——Java 大数据在智慧交通智能停车诱导系统中的数据融合与实时更新
  • 命令行快速上传文件到SFTP服务器(附参考示例)
  • 灰度图像和RGB图像在数据大小和编码处理方式差别
  • lanqiaoOJ 652:一步之遥 ← 扩展欧几里得定理
  • ESP32-S3R8 使能PSRAM内存
  • 【嵌入式笔记】Modbus TCP
  • 鬼泣:蓄力攻击总结
  • 《AI大模型应知应会100篇》第63篇:AutoGPT 与 BabyAGI:自主代理框架探索
  • 计算机网络:怎么理解调制解调器的数字调制技术?
  • 《AI驱动的智能推荐系统:原理、应用与未来》
  • Java面试八股Spring篇(4500字)
  • 某某霸翻译逆向分析[JS逆向]
  • 计算机系统概述——了解冯诺伊曼 CPI相关公式
  • 基于Qt的OSG三维建模
  • 【Redis实战篇】秒杀优化