营销平台网站建设,商城推广文案,做调查网站怎样换IP,网站主题风格有哪些目录 1、ADC的介绍
2、ADC主要特征
3、ADC结构与引脚
4、ADC配置流程
5、示例#xff08;光敏电阻的ADC采样#xff09;
6、提示
7、结语#xff1a; 1、ADC的介绍
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道#xff0c;可测量16个外部和2个内部 信号…目录 1、ADC的介绍
2、ADC主要特征
3、ADC结构与引脚
4、ADC配置流程
5、示例光敏电阻的ADC采样
6、提示
7、结语 1、ADC的介绍
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 ADC的输入时钟不得超过14MHz它是由PCLK2经分频产生。
2、ADC主要特征
● 12位分辨率
● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断
● 单次和连续转换模式
● 从通道0到通道n的自动扫描模式
● 自校准
● 带内嵌数据一致性的数据对齐
● 采样间隔可以按通道分别编程
● 规则转换和注入转换均有外部触发选项
● 间断模式
● 双重模式(带2个或以上ADC的器件)
● ADC转换时间 ─ STM32F103xx增强型产品时钟为56MHz时为1μs(时钟为72MHz为1.17μs) ─ STM32F101xx基本型产品时钟为28MHz时为1μs(时钟为36MHz为1.55μs) ─ STM32F102xxUSB型产品时钟为48MHz时为1.2μs ─ STM32F105xx和STM32F107xx产品时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
● ADC供电要求2.4V到3.6V
● ADC输入范围VREF- ≤ VIN ≤ VREF
● 规则通道转换期间有DMA请求产生。
3、ADC结构与引脚 4、ADC配置流程 时钟使能: 首先需要使能ADC的时钟。这通常涉及到修改RCC寄存器具体操作取决于你的芯片型号。例如RCC_APB2Periph_ADC1 (假设ADC1)。 你需要查阅你的芯片数据手册确定正确的寄存器和位。 ADC复位: 通常需要复位ADC这可以通过设置相应的寄存器位来实现。 ADC配置: 这一步是最关键的你需要配置ADC的各个参数这主要通过操作ADC的寄存器来完成。 重要的寄存器包括 ADC_CR1 (控制寄存器1): 配置ADC的模式单次转换、连续转换、扫描模式、数据对齐等。ADC_CR2 (控制寄存器2): 配置ADC的触发方式、转换完成中断等。ADC_SMPR1/SMPR2 (采样时间寄存器): 配置ADC的采样时间。ADC_SQR1/SQR3 (正则顺序寄存器): 配置ADC的转换顺序如果进行多通道转换。ADC_DR (数据寄存器): 读取转换结果。ADC_CSR (校准状态寄存器): 进行ADC校准。 通道选择: 选择要使用的ADC通道。这通常涉及到设置ADC_SQR1 或 ADC_SQR3寄存器。 ADC校准 (可选): 为了提高精度可以进行ADC校准。 这通常涉及到设置ADC_CR2寄存器中的CAL位。 ADC使能: 使能ADC这通常涉及到设置ADC_CR2寄存器中的ADON位。 启动转换: 启动ADC转换这通常涉及到设置ADC_CR2寄存器中的SWSTART位或者通过触发方式启动转换。 读取数据: 从ADC_DR寄存器读取转换结果。 ADC关闭 (可选): 转换完成后可以关闭ADC以节省功耗。
5、示例光敏电阻的ADC采样
ADC.h
#ifndef _ADC_H_
#define _ADC_H_void Light_Init(void);
int Light_Getval(void);#endifADC.c
#include ADC.h
#include stm32f10x.h//PB0--ADC1_IN8
void Light_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);GPIO_InitTypeDef GPIOB_Struct;GPIOB_Struct.GPIO_Mode GPIO_Mode_AIN;GPIOB_Struct.GPIO_Pin GPIO_Pin_0;//GPIOB_Struct.GPIO_SpeedGPIO_Init(GPIOB,GPIOB_Struct);RCC_ADCCLKConfig(RCC_PCLK2_Div6);//6分频 clock12mhzADC_InitTypeDef ADC_Struct;ADC_Struct.ADC_ContinuousConvMode DISABLE;ADC_Struct.ADC_DataAlign ADC_DataAlign_Right;ADC_Struct.ADC_ExternalTrigConv ADC_ExternalTrigConv_None;ADC_Struct.ADC_Mode ADC_Mode_Independent;ADC_Struct.ADC_NbrOfChannel 1;ADC_Struct.ADC_ScanConvMode DISABLE;ADC_Init(ADC1,ADC_Struct);//校准ADC_Cmd(ADC1,ENABLE);//复位校准ADC_ResetCalibration(ADC1);//等待复位结束while(RESET ! ADC_GetResetCalibrationStatus(ADC1)){static int count 0;count;if(count 10000){break;}}//开启校准ADC_StartCalibration(ADC1);//等待校准结束while(RESET ! ADC_GetCalibrationStatus(ADC1)){static int count 0;count;if(count 10000){break;}}
}int Light_Getval(void)
{//转换顺序通道选择采样时间ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_55Cycles5);//软件触发ADC_SoftwareStartConvCmd(ADC1,ENABLE);//等待转换结束while(SET ! ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)){static int count 0;count;if(count 10000){return -1;}}//获取转换结果uint16_t ret ADC_GetConversionValue(ADC1);//ret 0~4096return 100 - (ret/41);
}
6、提示
keil经常会报警告
ADC.h(8): warning: #1-D: last line of file ends without a newline
解决办法在最后一行多敲一行空行
原理
在Keil MDK中最后一行添加空行并非强制要求也不是Keil编译器本身的规定。 它更多的是一种编程风格和习惯并没有实际的功能影响。 一些人认为这样做可以提高代码的可读性和整洁性方便阅读和维护。
虽然没有强制要求但这种习惯在嵌入式开发中比较常见原因如下 避免潜在的编译器警告或错误: 虽然极少见但某些编译器在处理文件结尾时可能会有特殊的处理方式添加空行可以避免一些不必要的警告或错误特别是对于一些比较老旧的编译器。 版本控制系统: 在使用版本控制系统如Git时在文件末尾添加空行可以避免不必要的冲突因为不同的编辑器可能会在文件末尾添加不同的换行符。 代码美观和可读性: 这可能是最主要的原因。一个干净整洁的代码文件在结尾处留一个空行视觉上会更舒服也更易于阅读和理解。 这是一种良好的编程习惯有利于团队合作和代码维护。 习惯: 很多程序员都习惯在文件末尾添加空行这已经成为一种约定俗成的习惯。
总而言之在Keil中最后一行加空行主要是一种代码风格和习惯问题对编译和运行没有任何实际影响但有助于提高代码的可读性和可维护性。 是否添加完全取决于个人或团队的代码规范。
我的个人意见好像与团队项目中代码移植之类的有关系如果是个人项目完全可以忽略如果是团队项目好像是最后一行会有一些缓存之类的操作可能团队项目时整合会发生别人的代码的第一行和你的最后一行在一行里所以团队项目可以加上空行
7、结语
还有很多东西没有讲解比如双adc比如注入与规则通道等
本文的目的在于辅助上手具体的原理在芯片手册中有完整的讲解有兴趣的同学可以自行查阅