96SEO 2026-02-19 23:19 9
*ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量建立模拟电路到数字电路的桥梁

*输入电压范围0~3.3V转换结果范围0~409512位转换分辨率
*18个输入通道可测量16个外部和2个内部信号源在任意多个通道上以任意顺序进行的一系列转换构成成组转换规则通道。
例如可以如下顺序完成转换通道3、通道8、通道2、通道0、通道2、通道2、通道15
*规则组和注入组两个转换单元规则通道我们平时用的一般通道按顺序进行转换注入通道可以理解为插入。
它是一种在规则通道转换的时候强行插入要转换的一种。
注入通道只有在规则通道存在的时候才会出现
ADC资源ADC1、ADC210个外部输入通道F4有三个ADC
ps:STM32f103c8t6有ADC1和ADC2有两个转换单元规则组、注入组规则组有16个通道注入组有4个通道。
只能用于ADC1只有一个数据寄存器注入通道没有数据覆盖的问题四个通道有四个存放寄存器
*非扫描模式只能用于只有一个转换通道有多个转换通道时要设置扫描模式
*非扫描模式只能用于只有一个转换通道有多个转换通道时要设置扫描模式
*ADC规则通道的转换次序是由由序列1到序列16依次转换有通道就转换没通道就跳过如果转换次序需要较高优先级那就要把该通道放在靠前序列
*连续转换模式是当前面ADC转换一结束马上就启动另一次转换。
此模式可通过外部触发启动或通过设置ADC_CR2寄存器上的ADON位启动此时CONT位是1。
通过设置寄存器里面不同的值来配置不同通道的转换顺序以及转换的总通道数量
ADC_conversionValue;//单ADC模式时数据寄存器只用到低16位用来存放
ADC_GPIO_StructInit;ADCx_PIN_RCC_Clock_Cmd(ADCx_PIN_Periph,ENABLE);ADC_GPIO_StructInit.GPIO_Mode
//必须是模拟输入ADC_GPIO_StructInit.GPIO_Pin
ADCx_PIN;GPIO_Init(ADCx_PIN_PORT,
DMA_StructInit;/*--------------------------DMA-----------------------------------------*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,
//打开时钟DMA_DeInit(DMA1_Channel1);
//将DMA寄存器复位成刚上电的样子DMA_StructInit.DMA_MemoryBaseAddr
//存储器地址DMA_StructInit.DMA_PeripheralBaseAddr
//传输方向DMA_StructInit.DMA_BufferSize
//传输数目DMA_StructInit.DMA_PeripheralDataSize
DMA_PeripheralDataSize_HalfWord;//外设数据宽度数据寄存器只用到低16位DMA_StructInit.DMA_MemoryDataSize
//存储器数据宽度数据寄存器只用到低16位DMA_StructInit.DMA_PeripheralInc
//外设地址是否递增DMA_StructInit.DMA_MemoryInc
//存储器地址是否递增DMA_StructInit.DMA_Mode
//模式选择现在时循环模式DMA_StructInit.DMA_Priority
DMA_StructInit);DMA_Cmd(DMA1_Channel1,
ENABLE);/*---------------------ADC------------------------------------*/ADCx_RCC_Clock_Cmd(ADCx_Periph,
ENABLE);ADC_StructInit.ADC_Mode
//设置独立模式因为只有一个ADC通道ADC_StructInit.ADC_ScanConvMode
//配置是否扫描用在多通道ADC_StructInit.ADC_ContinuousConvMode
//配置是否要连续转换ADC_StructInit.ADC_DataAlign
//配置数据的对齐模式ADC_StructInit.ADC_NbrOfChannel
//配置要转换通道的数目ADC_StructInit.ADC_ExternalTrigConv
ADC_ExternalTrigConv_None;//配置触发模式这里是软件触发外部触发是有定时器或者GPIO才会使用ADC_Init(ADC_x,
ADC_StructInit);RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//时钟配置72/89MADC_RegularChannelConfig(ADC_x,
//规则通道的配置第三个参数是配置第几次转换第四个参数是配置采样周期ADC_Cmd(ADC_x,
//使能ADC中断ADC_StartCalibration(ADC_x);
//开始校准ADCwhile(ADC_GetCalibrationStatus(ADC_x));
//等待校准完成ADC_SoftwareStartConvCmd(ADC_x,
{ACDx_GPIO_Config();Config_ADC_Init();
0;initSysTick();usart_init();ADCx_Init();while(1){conversionValue
(float)ADC_conversionValue/4096*3.3;printf(hex
%04x\r\n,ADC_conversionValue);printf(conversionValue
%f\r\n,conversionValue);ms_delay(2000);}}2、ADC单通道中断读取
RCC_APB2PeriphClockCmd//ADC配置的宏
ADC_GPIO_StructInit;ADCx_PIN_RCC_Clock_Cmd(ADCx_PIN_Periph,ENABLE);ADC_GPIO_StructInit.GPIO_Mode
//必须是模拟输入ADC_GPIO_StructInit.GPIO_Pin
ADCx_PIN;GPIO_Init(ADCx_PIN_PORT,
ADC_StructInit;ADCx_RCC_Clock_Cmd(ADCx_Periph,
ENABLE);ADC_StructInit.ADC_Mode
//设置独立模式因为只有一个ADC通道ADC_StructInit.ADC_ScanConvMode
//配置是否扫描用在多通道ADC_StructInit.ADC_ContinuousConvMode
//配置是否要连续转换ADC_StructInit.ADC_DataAlign
//配置数据的对齐模式ADC_StructInit.ADC_NbrOfChannel
//配置要转换通道的数目ADC_StructInit.ADC_ExternalTrigConv
ADC_ExternalTrigConv_None;//配置触发模式这里是软件触发外部触发是有定时器或者输入引脚触发才会使用ADC_Init(ADC_x,
ADC_StructInit);RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//时钟配置72/89MADC_RegularChannelConfig(ADC_x,
//规则通道的配置第三个参数是配置第几个转换换通道第四个参数是配置采样周期第二个参数是第几个通道例A0是通道1ADC_ITConfig(ADC_x,
//使能ADC中断ADC_StartCalibration(ADC_x);
//开始校准ADCwhile(ADC_GetCalibrationStatus(ADC_x));
//等待校准完成ADC_SoftwareStartConvCmd(ADC_x,
ADCx_NVIC_StructInit;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);ADCx_NVIC_StructInit.NVIC_IRQChannel
ADC1_2_IRQn;ADCx_NVIC_StructInit.NVIC_IRQChannelCmd
ENABLE;ADCx_NVIC_StructInit.NVIC_IRQChannelPreemptionPriority
1;ADCx_NVIC_StructInit.NVIC_IRQChannelSubPriority
1;NVIC_Init(ADCx_NVIC_StructInit);
{ACDx_GPIO_Config();Config_ADC_Init();ADCx_NVIC_Config();
0;initSysTick();usart_init();ADCx_Init();while(1){ADC_Value
(float)ADC_Conversion_value/4096*3.3;printf(adc_float%fv\r\n,ADC_Value);printf(adc_Hex%04x\r\n,ADC_Conversion_value);ms_delay(2000);}}void
ADC_GetConversionValue(ADC_x);//读取转换的数值}ADC_ClearITPendingBit(ADC_x,
RCC_APB2PeriphClockCmd//ADC配置的宏
ADC_conversionValue[len];//单ADC模式时数据寄存器只用到低16位用来存放
ADC_GPIO_StructInit;ADCx_PIN_RCC_Clock_Cmd(ADCx_PIN_Periph,ENABLE);ADC_GPIO_StructInit.GPIO_Mode
//必须是模拟输入ADC_GPIO_StructInit.GPIO_Pin
GPIO_Pin_3;GPIO_Init(ADCx_PIN_PORT,
DMA_StructInit;/*--------------------------DMA-----------------------------------------*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,
//打开时钟DMA_DeInit(DMA1_Channel1);
//将DMA寄存器复位成刚上电的样子DMA_StructInit.DMA_MemoryBaseAddr
//存储器地址DMA_StructInit.DMA_PeripheralBaseAddr
//传输方向DMA_StructInit.DMA_BufferSize
外设数据大小为半字即两个字节DMA_StructInit.DMA_PeripheralDataSize
DMA_PeripheralDataSize_HalfWord;//外设数据宽度数据寄存器只用到低16位//
内存数据大小也为半字跟外设数据大小相同DMA_StructInit.DMA_MemoryDataSize
//存储器数据宽度数据寄存器只用到低16位DMA_StructInit.DMA_PeripheralInc
//外设地址是否递增DMA_StructInit.DMA_MemoryInc
//存储器地址是否递增DMA_StructInit.DMA_Mode
//模式选择现在时循环模式DMA_StructInit.DMA_Priority
DMA_StructInit);DMA_Cmd(DMA1_Channel1,
ENABLE);/*---------------------ADC------------------------------------*/ADCx_RCC_Clock_Cmd(ADCx_Periph,
ENABLE);ADC_StructInit.ADC_Mode
//设置独立模式因为只有一个ADCADC_StructInit.ADC_ScanConvMode
//配置是否扫描用在多通道ADC_StructInit.ADC_ContinuousConvMode
//配置是否要连续转换ADC_StructInit.ADC_DataAlign
//配置数据的对齐模式ADC_StructInit.ADC_NbrOfChannel
//配置要转换通道的数目ADC_StructInit.ADC_ExternalTrigConv
ADC_ExternalTrigConv_None;//配置触发模式这里是软件触发外部触发是有定时器或者输入引脚触发才会使用ADC_Init(ADC_x,
ADC_StructInit);RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//时钟配置72/89MADC_RegularChannelConfig(ADC_x,
//规则通道的配置第三个参数是配置第几次转换第四个参数是配置采样周期ADC_RegularChannelConfig(ADC_x,
ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x,
ADC_SampleTime_55Cycles5);ADC_Cmd(ADC_x,
等待校准寄存器初始化完成while(ADC_GetResetCalibrationStatus(ADC_x));ADC_StartCalibration(ADC_x);
//开始校准ADCwhile(ADC_GetCalibrationStatus(ADC_x));
//等待校准完成ADC_SoftwareStartConvCmd(ADC_x,
{ACDx_GPIO_Config();Config_ADC_Init();
0;initSysTick();usart_init();ADCx_Init();printf(\r\n
----这是一个ADC多通道采集实验----\r\n);while(1){ADC_ConvertedValueLocal[0]
ADC_conversionValue[0]/4096*3.3;ADC_ConvertedValueLocal[1]
ADC_conversionValue[1]/4096*3.3;ADC_ConvertedValueLocal[2]
ADC_conversionValue[2]/4096*3.3;printf(\r\n
\r\n,ADC_ConvertedValueLocal[0]);printf(\r\n
\r\n,ADC_ConvertedValueLocal[1]);printf(\r\n
\r\n,ADC_ConvertedValueLocal[2]);ms_delay(2000);}}
*不要在2个ADC上转换相同的通道((两个ADC在同一个通道上的采样时间不能重善)。
的转换结束时产生一个32位DMA传输请求(如果设置了DMA位)32位的ADC1_DR寄存器内容传输到SRAM中它
RCC_APB2PeriphClockCmd//ADC配置的宏
ADC_conversionValue[len];//单ADC模式时数据寄存器只用到低16位用来存放
ADC_GPIO_StructInit;ADCx_PIN_RCC_Clock_Cmd(ADCx_PIN_Periph,ENABLE);ADC_GPIO_StructInit.GPIO_Mode
//必须是模拟输入ADC_GPIO_StructInit.GPIO_Pin
DMA_StructInit;/*--------------------------DMA-----------------------------------------*/RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,
//打开时钟DMA_DeInit(DMA1_Channel1);
//将DMA寄存器复位成刚上电的样子DMA_StructInit.DMA_MemoryBaseAddr
//存储器地址DMA_StructInit.DMA_PeripheralBaseAddr
//传输方向DMA_StructInit.DMA_BufferSize
外设数据大小为半字即两个字节DMA_StructInit.DMA_PeripheralDataSize
内存数据大小也为半字跟外设数据大小相同DMA_StructInit.DMA_MemoryDataSize
//存储器数据宽度(32位)DMA_StructInit.DMA_PeripheralInc
//外设地址是否递增DMA_StructInit.DMA_MemoryInc
//存储器地址是否递增DMA_StructInit.DMA_Mode
//模式选择现在时循环模式DMA_StructInit.DMA_Priority
DMA_StructInit);DMA_Cmd(DMA1_Channel1,
ENABLE);/*---------------------ADC1------------------------------------*/ADCx_RCC_Clock_Cmd(ADCx_Periph,
ENABLE);ADC_StructInit.ADC_Mode
//设置成规则同步模式因为有两个ADCADC_StructInit.ADC_ScanConvMode
//配置是否扫描用在多通道ADC_StructInit.ADC_ContinuousConvMode
//配置是否要连续转换ADC_StructInit.ADC_DataAlign
//配置数据的对齐模式ADC_StructInit.ADC_NbrOfChannel
//配置要转换通道的数目ADC_StructInit.ADC_ExternalTrigConv
ADC_ExternalTrigConv_None;//配置触发模式这里是软件触发外部触发是有定时器或者输入引脚触发才会使用ADC_Init(ADC_x,
ADC_StructInit);RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//使能ADC中断ADC_RegularChannelConfig(ADC_x,
ADC_SampleTime_55Cycles5);//设置通道1PA1//使能DMA
ENABLE);/*--------------------ADC2-------------------------------------*/ADCx_RCC_Clock_Cmd(RCC_APB2Periph_ADC2,
ENABLE);ADC_StructInit.ADC_Mode
//设置成规则同步模式因为有两个ADCADC_StructInit.ADC_ScanConvMode
//配置是否扫描用在多通道ADC_StructInit.ADC_ContinuousConvMode
//配置是否要连续转换ADC_StructInit.ADC_DataAlign
//配置数据的对齐模式ADC_StructInit.ADC_NbrOfChannel
//配置要转换通道的数目ADC_StructInit.ADC_ExternalTrigConv
ADC_ExternalTrigConv_None;//配置触发模式这里是软件触发外部触发是有定时器或者GPIO才会使用
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//使能ADC中断ADC_RegularChannelConfig(ADC2,
ADC_SampleTime_55Cycles5);//设置通道2PA2/*
*/ADC_ExternalTrigConvCmd(ADC2,
等待校准寄存器初始化完成while(ADC_GetResetCalibrationStatus(ADC_x));ADC_StartCalibration(ADC_x);
//开始校准ADCwhile(ADC_GetCalibrationStatus(ADC_x));
等待校准寄存器初始化完成while(ADC_GetResetCalibrationStatus(ADC2));ADC_StartCalibration(ADC2);
//开始校准ADCwhile(ADC_GetCalibrationStatus(ADC2));
//等待校准完成ADC_SoftwareStartConvCmd(ADC_x,
{ACDx_GPIO_Config();Config_ADC_Init();
ADC_conversionValue[len];//单ADC模式时数据寄存器只用到低16位用来存放
ADC_ConvertedValueLocal[len*2];
,temp10;initSysTick();usart_init();ADCx_Init();printf(\r\n
----这是一个双ADC规则同步采集实验----\r\n);while(1){//
取出ADC1数据寄存器的高16位这个是ADC2的转换数据temp0
(ADC_conversionValue[0]0XFFFF0000)
取出ADC1数据寄存器的低16位这个是ADC1的转换数据temp1
(ADC_conversionValue[0]0XFFFF);
//取低16位ADC1的数据ADC_ConvertedValueLocal[0]
temp0/4096*3.3;ADC_ConvertedValueLocal[1]
\r\n,ADC_ConvertedValueLocal[1]);printf(\r\n
\r\n,ADC_ConvertedValueLocal[0]);ms_delay(2000);}}PS
*多路ADC模式的时候ADC1ADC2一起使用例如设置规则同步的时候通道的数目要一致ADC1有两个通道ADC2也需要有两个通道
的触发转换有两种方法分别是通过软件或外部事件(也就是硬件)触发转换。
*ADC有一个内置自校准模式。
校准可大幅减小因内部电容器组的变化而造成的准精度误差。
校准期间在每个电容器上都会计算出一个误差修正码(数字值)这个码用于消除在随后的转换中每个电容器上产生的误差
*因为规则通道转换的值储存在一个仅有的数据寄存器中所以当转换多个规则通道时需要使用
*只有在规则通道的转换结束时才产生DMA请求并将转换的数据从ADC_DR寄存器传输到用户
*只有ADC1和ADC3拥有DMA功能。
由ADC2转化的数据可以通过双ADC模式利用ADC1的DMA功能传输。
(ADC2转换的数据要用DMA传输的时候就可以用双ADC模式)。
*规则和注入组转换结束时能产生中断当模拟看门狗状态位被设置时也能产生中断。
它们都有
*ADC1和ADC2的中断映射在同一个中断向量上而ADC3的中断有自己的中断向量。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback