任务5-2 ADC中断方式实现多通道电压采集_第1页
任务5-2 ADC中断方式实现多通道电压采集_第2页
任务5-2 ADC中断方式实现多通道电压采集_第3页
任务5-2 ADC中断方式实现多通道电压采集_第4页
任务5-2 ADC中断方式实现多通道电压采集_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

核心能力中断采集·多通道配置难度等级中级建议课时4学时STM32EMBEDDEDTECHNOLOGYSTM32嵌入式技术及应用5-2ADC中断方式实现多通道电压采集项目五简易多通道电压采集系统的设计CONTENTS目录01任务目标明确学习目标与能力要求,掌握ADC中断采集的核心概念,为实践操作奠定理论基础核心能力培养02知识储备学习ADC多通道配置、中断模式原理与实现方法,深入理解中断触发机制理论基础03任务实施动手实践:硬件设计、程序编写、系统联调,从零开始实现ADC中断采集实践操作04任务总结梳理核心知识点、技能提升要点,巩固所学为后续学习做准备知识梳理05提升训练与评价通过知识问答、实践操作和任务评价,巩固所学知识,提升工程实践能力,培养创新思维能力提升01CHAPTERONE任务目标明确学习目标与能力要求为ADC中断采集打下坚实基础掌握中断采集原理配置多通道ADC实现数据显示TASKOBJECTIVES任务目标01配置ADC中断采集配置STM32的ADC模块以中断方式工作,通过PA0/AIN0和PA1/AIN1通道输入模拟信号,掌握ADC多通道配置方法GPIO模拟输入配置ADC时钟与模式设置02实现中断服务程序ADC转换完成后触发中断服务程序,读取并处理转换得到的数字量,理解中断触发机制与优先级设置NVIC中断控制器配置中断服务函数编写03数据显示实时观测将处理后的数字量显示在LCD1602液晶屏上,实时观测模拟信号变化,实现人机交互LCD初始化与显示电压值计算与转换学习成果预期完成本任务后,你将能够独立实现ADC中断方式多通道电压采集,理解中断触发机制与优先级设置,掌握NVIC中断控制器配置方法,为后续复杂嵌入式应用开发打下坚实基础。同时培养绿色设计理念,通过合理的中断配置实现低功耗设计。02CHAPTERTWO知识储备理论基础与核心概念深入理解ADC多通道采集与中断模式多通道配置中断机制NVIC优先级ADCMULTI-CHANNELCONFIGURATIONADC多通道采集配置(一)-GPIO初始化配置步骤说明多通道ADC采集的第一步是初始化GPIO引脚,将需要的引脚配置为模拟输入模式。这是ADC采集的基础配置,确保模拟信号能够正确输入到ADC模块。GPIO初始化代码示例GPIO_InitTypeDef

GPIO_InitStructure;//

启用GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,

ENABLE);//

配置PA0~PA1为模拟输入GPIO_InitStructure.GPIO_Pin

=

GPIO_Pin_0

|

GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode

=

GPIO_Mode_AIN;

//

模拟输入模式GPIO_Init(GPIOA,

&GPIO_InitStructure);关键配置要点1时钟使能必须先启用GPIOA时钟,否则配置无效2引脚选择PA0对应ADC通道0,PA1对应ADC通道13模式配置必须使用GPIO_Mode_AIN模拟输入模式重要提示GPIO_Mode_AIN是模拟输入模式,GPIO引脚不经过施密特触发器,直接连接到ADC模块,确保模拟信号的完整性。多通道采集时,需要同时配置多个GPIO引脚,使用|运算符进行组合。ADCMULTI-CHANNELCONFIGURATIONADC多通道采集配置(二)-ADC初始化ADC初始化关键步骤ADC初始化包括时钟配置、模式设置、数据对齐等多个关键步骤。正确的初始化配置是ADC正常工作的前提。ADC初始化代码示例ADC_InitTypeDef

ADC_InitStructure;//

启用ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,

ENABLE);//

配置ADC时钟为PCLK2的6分频RCC_ADCCLKConfig(RCC_PCLK2_Div6);//

ADC模式配置ADC_InitStructure.ADC_Mode

=

ADC_Mode_Independent;

//

独立模式ADC_InitStructure.ADC_ScanConvMode

=

ENABLE;

//

启用扫描模式ADC_InitStructure.ADC_ContinuousConvMode

=

ENABLE;

//

启用连续转换ADC_InitStructure.ADC_ExternalTrigConv

=

ADC_ExternalTrigConv_None;

//

禁用外部触发ADC_InitStructure.ADC_DataAlign

=

ADC_DataAlign_Right;

//

数据右对齐ADC_InitStructure.ADC_NbrOfChannel

=

2;

//

采集2个通道ADC_Init(ADC1,

&ADC_InitStructure);配置参数详解ADC_Mode_Independent独立模式,ADC1和ADC2独立工作ADC_ScanConvMode扫描模式,按顺序扫描多个通道ADC_ContinuousConvMode连续转换模式,自动进行下一次转换ADC_DataAlign_Right数据右对齐,12位数据存储在低12位时钟配置说明RCC_PCLK2_Div6表示ADC时钟为PCLK2的6分频。若PCLK2为72MHz,则ADC时钟为12MHz,满足ADC时钟不超过14MHz的要求。ADCMULTI-CHANNELCONFIGURATIONADC多通道采集配置(三)-通道配置通道配置说明配置ADC通道和采样顺序,设置采样通道的顺序和采样时间。采样顺序决定了多通道采集时的转换次序,采样时间影响转换精度和速度。通道配置代码示例//

PA0作为第1采样通道ADC_RegularChannelConfig(ADC1,

ADC_Channel_0,

//

通道0

1,

//

第1个转换

ADC_SampleTime_239Cycles5

//

采样时间);//

PA1作为第2采样通道ADC_RegularChannelConfig(

ADC1,

ADC_Channel_1,

//

通道1

2,

//

第2个转换

ADC_SampleTime_239Cycles5

//

采样时间);通道配置参数ADC1ADC模块选择ADC_Channel_0/1通道编号(0-17)1/2转换顺序(1-16)ADC_SampleTime_239Cycles5239.5个时钟周期采样时间选择ADC_SampleTime_239Cycles5表示239.5个ADC时钟周期的采样时间。若ADC时钟为12MHz,采样时间为:239.5÷12MHz=19.96μs较长的采样时间可以提高转换精度,但会降低采样率。QUERYMODELIMITATIONS查询方式的局限性查询方式工作原理在查询方式中,程序通过循环反复检查ADC转换完成的标志位(如EOC标志)。只有当标志位置位时,程序才会继续执行后续操作。查询方式代码示例//

等待ADC转换完成while

(!ADC_GetFlagStatus(

ADC1,

ADC_FLAG_EOC))

{

//

循环等待,CPU被占用}//

读取转换结果uint16_t

adc_result

=

ADC_GetConversionValue(ADC1);核心问题while循环期间,CPU无法执行其他任务,造成资源浪费,系统效率低下。查询方式的两大缺点1CPU资源占用高在等待ADC完成转换的过程中,CPU无法执行其他任务,导致系统效率降低。大量的CPU时间被浪费在轮询标志位上。CPU利用率低下2响应速度受限若有多个任务需要处理,查询方式可能会导致其他任务被延迟执行,影响系统的实时性和响应速度。实时性差适用场景分析查询方式虽然简单,但仅适用于单任务、对实时性要求不高的场景。在复杂嵌入式系统中,应采用更高效的中断方式。ADCINTERRUPTMODEADC中断模式的优势中断模式工作原理中断模式通过配置ADC的中断功能,在ADC转换完成时触发中断。此时,CPU会自动跳转到中断服务函数(ISR)中执行预先定义的操作,如读取转换结果。查询方式vs中断方式对比查询方式•CPU持续轮询标志位•无法执行其他任务•资源利用率低中断方式•CPU执行其他任务•中断触发后处理•资源利用率高CPU利用率25%100%中断模式核心优势并行处理能力允许CPU在ADC转换期间执行其他任务,提高系统的并行处理能力实时响应转换完成后立即触发中断,无需等待,响应速度快绿色设计通过合理的中断配置,实现低功耗设计,降低系统能耗工作流程1启动ADC转换2CPU执行其他任务3转换完成触发中断4执行中断服务函数INTERRUPTTRIGGERTYPESSTM32ADC三种中断触发类型MOSTUSED规则转换完成中断EOCEndOfConversion当ADC完成当前通道的模数转换后触发单通道转换处理逐步处理多通道数据最常用的中断类型ADC_IT_EOCHIGHPRIORITY注入转换完成中断JEOCInjectedConversionComplete用于注入通道的转换完成,一般用于优先级更高的转换任务紧急数据采集高优先级任务打断规则通道转换ADC_IT_JEOCPROTECTION模拟看门狗中断AWDAnalogWatchdog当ADC输入电压超出设定的阈值范围时触发监控电压范围触发报警机制系统保护功能ADC_IT_AWD规则转换完成中断(EOC)是最常用的中断类型,本任务将基于EOC中断实现多通道电压采集。IMPLEMENTINGEOCINTERRUPT实现规则转换完成中断(一)-使能ADC中断第一步:使能ADC中断实现规则转换完成中断的第一步是使能ADC的外设中断功能。通过标准库函数启用规则转换完成的中断功能,让ADC在转换完成后能够触发中断。使能EOC中断代码//

使能ADC1的EOC中断ADC_ITConfig(

ADC1,

//

ADC模块

ADC_IT_EOC,

//

EOC中断类型

ENABLE

//

使能);//

启用ADC1ADC_Cmd(ADC1,

ENABLE);函数说明ADC_ITConfig()函数用于配置ADC中断,参数包括ADC模块、中断类型和使能状态。函数参数详解ADC1ADC模块选择,可以是ADC1或ADC2ADC_IT_EOC规则转换完成中断标志ENABLE使能中断,DISABLE为禁用重要提示•必须先调用ADC_ITConfig()使能中断,再调用ADC_Cmd()启用ADC•顺序错误可能导致中断无法正常触发•使能中断后,每次ADC转换完成都会触发中断完整流程ADC初始化使能中断启用ADCIMPLEMENTINGEOCINTERRUPT实现规则转换完成中断(二)-NVIC配置第二步:配置NVIC配置嵌套向量中断控制器(NVIC),设置ADC中断的优先级并使能中断。NVIC是Cortex-M3内核的中断管理单元,负责中断的优先级管理和调度。NVIC初始化代码NVIC_InitTypeDef

NVIC_InitStructure;//

配置中断优先级分组NVIC_PriorityGroupConfig(

NVIC_PriorityGroup_2);//

配置ADC1_2中断通道NVIC_InitStructure.NVIC_IRQChannel

=

ADC1_2_IRQn;

//

ADC中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority

=

1;

//

抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority

=

0;

//

响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd

=

ENABLE;

//

使能中断NVIC_Init(&NVIC_InitStructure);优先级分组说明NVIC_PriorityGroup_22位抢占优先级+2位响应优先级抢占:0-3响应:0-3抢占优先级:高优先级可打断低优先级中断响应优先级:相同抢占优先级时的处理顺序NVIC配置参数NVIC_IRQChannel中断通道,ADC1_2_IRQnNVIC_IRQChannelPreemptionPriority抢占优先级,数值越小优先级越高NVIC_IRQChannelSubPriority响应优先级,相同抢占优先级时有效IMPLEMENTINGEOCINTERRUPT实现规则转换完成中断(三)-中断服务函数第三步:编写中断服务函数定义ADC中断服务函数,以处理ADC转换完成后的操作。中断服务函数需要检查中断标志、读取转换结果、清除中断标志,确保中断能够正常响应。中断服务函数代码//

ADC中断服务函数void

ADC_IRQHandler(void){

//

检查EOC中断标志if

(ADC_GetITStatus(ADC1,

ADC_IT_EOC))

{

//

读取ADC转换结果

uint16_t

adc_result

=

ADC_GetConversionValue(ADC1);

//

处理ADC结果(存储或发送)//

...//

清除中断标志(重要!)

ADC_ClearITPendingBit(

ADC1,

ADC_IT_EOC

);

}}中断服务函数执行流程1检查中断标志ADC_GetITStatus()确认EOC中断2读取转换结果ADC_GetConversionValue()获取数据3处理数据存储、计算或发送转换结果4清除中断标志ADC_ClearITPendingBit()清除标志重要提醒清除中断标志是必须的!如果不清除中断标志,中断会持续触发,导致程序陷入无限中断循环,系统崩溃。中断服务函数应尽量简短,避免执行耗时操作。03CHAPTERTHREE任务实施动手实践与系统搭建从零开始实现ADC中断多通道采集硬件设计程序编写系统联调TASKIMPLEMENTATION任务实现要求与硬件设计任务实现要求1配置ADC中断采集配置STM32F103R6的ADC模块以中断方式工作,通过PA0/AIN0和PA1/AIN1通道输入模拟信号2实现中断服务程序ADC转换完成后触发中断服务程序,读取并处理转换得到的数字量3数据显示实时观测将处理后的数字量显示在LCD1602液晶屏上,实时观测模拟信号变化硬件设计模块ADC输入模块使用STM32的ADC通道0(PA0)和通道1(PA1)连接模拟信号源,模拟信号可以通过电位器调节电压值(0-3.3V)LCD显示模块使用字符型LCD模块,用于实时显示ADC采集的通道编号、转换数值和电压值。数据引脚(D0-D7)和控制引脚(RS、EN)连接到GPIOC端口STM32最小系统提供STM32运行所需的基本硬件,包括3.3V电源、外部晶振、复位电路等硬件仿真电路图STM32F103R6+电位器+LCD1602STM32电位器×2LCD1602图5-6双通道电压采集仿真电路图系统架构输入处理输出PROGRAMDESIGN程序设计概览程序架构程序主要包括GPIO初始化、ADC初始化、NVIC初始化、LCD初始化与显示函数、中断服务函数和主函数等模块。各模块协同工作,实现ADC中断方式多通道电压采集与显示。程序模块组成GPIO初始化配置LCD控制引脚和ADC输入通道ADC初始化配置ADC1的相关参数和模式NVIC初始化配置中断优先级及启用ADC中断LCD初始化初始化LCD显示模块和显示函数中断服务函数处理ADC转换完成后的逻辑主函数调用初始化函数和主循环程序执行流程系统启动上电复位,执行启动代码初始化阶段GPIO、ADC、NVIC、LCD初始化启动ADC转换开始第一次ADC转换主循环等待中断,处理数据显示中断触发转换完成,执行中断服务函数设计要点采用中断驱动方式,主循环只需检查标志位,大部分时间CPU可执行其他任务或进入低功耗模式。GPIOINITIALIZATIONGPIO初始化代码详解GPIO初始化功能GPIO初始化用于配置LCD控制引脚和ADC输入通道。LCD控制引脚配置为通用推挽输出模式,ADC输入通道配置为模拟输入模式。GPIO初始化代码void

MyGPIO_Init(void){

GPIO_InitTypeDef

MyGPIO;

//

打开GPIOC时钟(LCD控制引脚)

RCC_APB2PeriphClockCmd(

RCC_APB2Periph_GPIOC,

ENABLE

);

//

配置PC0~PC9为推挽输出

MyGPIO.GPIO_Pin

=

GPIO_Pin_0

|

GPIO_Pin_1

|

GPIO_Pin_2

|

GPIO_Pin_3

|

GPIO_Pin_4

|

GPIO_Pin_5

|

GPIO_Pin_6

|

GPIO_Pin_7|

GPIO_Pin_8

|

GPIO_Pin_9;

MyGPIO.GPIO_Speed

=

GPIO_Speed_50MHz;

MyGPIO.GPIO_Mode

=

GPIO_Mode_Out_PP;

GPIO_Init(GPIOC,

&MyGPIO);

//

打开GPIOA时钟(ADC输入)

RCC_APB2PeriphClockCmd(

RCC_APB2Periph_GPIOA,

ENABLE

);

//

配置PA0、PA1为模拟输入

MyGPIO.GPIO_Pin

=

GPIO_Pin_0

|

GPIO_Pin_1;

MyGPIO.GPIO_Mode

=

GPIO_Mode_AIN;

GPIO_Init(GPIOA,

&MyGPIO);}配置说明LCD控制引脚PC0-PC7:数据引脚D0-D7PC8:RS寄存器选择PC9:EN使能信号ADC输入通道PA0:ADC通道0PA1:ADC通道1模式:GPIO_Mode_AIN关键要点•必须先使能时钟,再配置GPIO•LCD引脚使用推挽输出模式,驱动能力强•ADC引脚必须使用模拟输入模式•GPIO_Speed_50MHz满足LCD时序要求ADCINITIALIZATIONADC初始化代码详解ADC初始化功能ADC初始化用于配置ADC1的相关参数,包括时钟配置、转换模式、数据对齐等。本任务采用单通道轮询方式,通过主循环切换通道,而非扫描模式。ADC初始化代码void

MyADC1_Init(void){

ADC_InitTypeDef

MyADC;

//

配置ADC时钟为PCLK2的6分频

RCC_ADCCLKConfig(RCC_PCLK2_Div6);

//

启用ADC1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,

ENABLE);

//

ADC模式配置

MyADC.ADC_Mode

=

ADC_Mode_Independent;

MyADC.ADC_ScanConvMode

=

DISABLE;

MyADC.ADC_ContinuousConvMode

=

DISABLE;

MyADC.ADC_ExternalTrigConv

=

ADC_ExternalTrigConv_None;

MyADC.ADC_DataAlign

=

ADC_DataAlign_Right;

MyADC.ADC_NbrOfChannel

=

1;

ADC_Init(ADC1,

&MyADC);

//

启用EOC中断

ADC_ITConfig(ADC1,

ADC_IT_EOC,

ENABLE);

//

启用ADC1

ADC_Cmd(ADC1,

ENABLE);}配置参数说明ADC_Mode_Independent独立模式,ADC单独工作ADC_ScanConvMode=DISABLE禁用扫描模式,单通道转换ADC_ContinuousConvMode=DISABLE禁用连续转换,单次转换ADC_DataAlign_Right数据右对齐,12位有效ADC_NbrOfChannel=1每次转换1个通道设计说明本任务采用软件切换通道方式,而非硬件扫描模式。优势:•更好的控制灵活性•可在通道间添加延时•便于调试和扩展NVICINITIALIZATIONNVIC初始化代码详解NVIC初始化功能NVIC初始化用于配置中断优先级及启用ADC中断。通过配置抢占优先级和响应优先级,确保ADC中断能够及时响应,同时避免与其他中断冲突。NVIC初始化代码void

MyNVIC_Init(void){

NVIC_InitTypeDef

MyNVIC;

//

配置中断优先级分组

NVIC_PriorityGroupConfig(

NVIC_PriorityGroup_2

);

//

配置ADC1_2中断通道

MyNVIC.NVIC_IRQChannel

=

ADC1_2_IRQn;

//

抢占优先级

MyNVIC.NVIC_IRQChannelPreemptionPriority

=

2;

//

响应优先级

MyNVIC.NVIC_IRQChannelSubPriority

=

2;

//

启用中断

MyNVIC.NVIC_IRQChannelCmd

=

ENABLE;

NVIC_Init(&MyNVIC);}优先级配置抢占优先级=2数值越小优先级越高。优先级为2的中断可以打断优先级为3的中断,但不能打断优先级为1的中断。响应优先级=2当多个中断具有相同的抢占优先级时,响应优先级决定处理顺序。数值越小越先处理。优先级分组Group_00位抢占+4位响应Group_11位抢占+3位响应Group_22位抢占+2位响应Group_33位抢占+1位响应Group_44位抢占+0位响应LCDINITIALIZATIONLCD初始化与显示函数(一)-LCD初始化LCD初始化功能LCD初始化用于配置LCD1602显示模块的工作模式,包括显示模式设置、清屏、光标配置等。正确的初始化序列是LCD正常显示的前提。LCD初始化代码void

LCD_Init(void){

//

配置显示模式:

8位数据,

2行,

5x7点阵

LCD_Write_Com(0x38);

//

关闭显示

LCD_Write_Com(0x08);

//

清屏

LCD_Write_Com(0x01);

//

延时等待for

(int

i

=

0;

i

<

100000;

i++);

//

设置光标移动方向:

地址自动+1

LCD_Write_Com(0x06);

//

打开显示,

无光标,

不闪烁

LCD_Write_Com(0x0C);}LCD指令说明0x38功能设置8位数据接口,2行显示,5×7点阵0x08显示控制关闭显示,准备清屏0x01清屏DDRAM清零,地址指针归位0x06输入模式地址自动+1,无显示移位0x0C显示开关显示开,光标关,闪烁关初始化顺序必须严格按照功能设置→显示关→清屏→延时→输入模式→显示开的顺序执行,否则LCD可能无法正常显示。LCDDISPLAYFUNCTIONSLCD初始化与显示函数(二)-字符串显示字符串显示功能LCD字符串显示函数用于在指定位置显示字符串,Num_conv_string函数将整数转换为字符串形式存储在字符数组中,便于LCD显示。字符串显示代码//

显示字符串void

LCD_Write_String(

char

x,

char

y,

char

*p)

{

while

(*p)

{

LCD_Write_Char(x,

y++,

*p++);

}}//

整数转换为字符串void

Num_conv_string(

int

temp,

char

*p)

{

int

i

=

0;

//

初始化字符数组for

(i

=

0;

i

<

4;

i++)

*(p

+

i)

=

'

';

*(p

+

i

-

1)

=

'0';

//

逐位转换

i

=

0;

while

(temp)

{

*(p

+

3

-

i)

=

temp

%

10

+

'0';

temp

/=

10;

i++;

}}函数说明LCD_Write_String•x:行号(0或1)•y:列号(0-15)•p:字符串指针Num_conv_string•temp:待转换整数•p:字符数组指针•输出:4位数字符串转换示例输入:123输出:"123"右对齐,不足4位前面补空格输入:4095输出:"4095"12位ADC最大值输入:0输出:"0"默认显示0INTERRUPTSERVICEFUNCTION中断服务函数详解中断服务函数功能中断服务函数实现ADC转换完成后的处理逻辑,包括检查中断标志、读取转换结果、设置标志位、清除中断标志。这是中断方式采集的核心代码。中断服务函数代码//

ADC中断服务函数void

ADC1_2_IRQHandler(void){

//

检查EOC中断标志if

(ADC_GetITStatus(ADC1,

ADC_IT_EOC))

{

//

清除中断标志

ADC_ClearITPendingBit(

ADC1,

ADC_IT_EOC

);

//

读取ADC转换值

ADCValue

=

ADC_GetConversionValue(ADC1);

//

设置标志位,通知主循环

ADCFlag

=

1;

}}执行流程1检查中断标志ADC_GetITStatus()确认EOC中断触发2清除中断标志ADC_ClearITPendingBit()清除EOC标志3读取转换结果ADC_GetConversionValue()获取12位ADC值4设置标志位ADCFlag=1通知主循环处理数据关键要点•必须先清除中断标志,再读取数据•清除标志后,新的转换才能触发中断•使用全局变量传递数据到主循环•中断服务函数应尽量简短快速•避免在中断中执行耗时操作MAINFUNCTION主函数详解(一)-初始化与主循环主函数结构主函数调用各初始化函数并实现ADC采集与显示的主循环。初始化顺序很重要,必须按照GPIO→NVIC→ADC→LCD的顺序执行。主函数代码框架int

main(void){

//

初始化GPIO、NVIC、ADC和LCD

MyGPIO_Init();

MyNVIC_Init();

MyADC1_Init();

LCD_Init();

//

启动第一次ADC转换

ADC_RegularChannelConfig(

ADC1,

ADC_Channel_0,

1,

ADC_SampleTime_239Cycles5

);

ADC_SoftwareStartConvCmd(ADC1,

ENABLE);

//

主循环while

(1)

{

//

检查ADC转换完成标志if

(ADCFlag)

{

//

处理并显示数据//

...

}

}}初始化顺序1MyGPIO_Init()配置GPIO引脚2MyNVIC_Init()配置中断优先级3MyADC1_Init()配置ADC模块4LCD_Init()初始化LCD显示重要说明•初始化顺序很重要!•NVIC必须在ADC之前初始化•启动第一次ADC转换后才能进入主循环•主循环通过查询标志位方式检测转换完成•避免在主循环中使用延时函数MAINFUNCTION主函数详解(二)-数据处理与通道切换数据处理与通道切换主循环中的数据处理逻辑包括显示通道号、显示ADC转换值、计算并显示电压值、切换通道、启动下一次转换。主循环数据处理代码while

(1)

{

if

(ADCFlag)

{

//

显示通道号

ADC_LCDDisplay[0]

=

ch

+

'0';

//

显示ADC转换值int

temp

=

ADCValue;

Num_conv_string(temp,

&ADC_LCDDisplay[2]);

//

计算并显示电压值

temp

=

ADCValue

*

3300

/

4095;

Num_conv_string(temp,

&ADC_LCDDisplay[7]);

//

LCD显示

LCD_Write_String(ch,

0,

ADC_LCDDisplay);

//

重置标志位

ADCFlag

=

0;

//

切换通道

ch

=

(ch

+

1)

%

2;

//

配置下一次转换通道if

(ch

==

0)

{

ADC_RegularChannelConfig(ADC1,

ADC_Channel_0,

1,ADC_SampleTime_239Cycles5);

}

else

{

ADC_RegularChannelConfig(ADC1,

ADC_Channel_1,

1,

ADC_SampleTime_239Cycles5);

}

//

启动下一次ADC转换

ADC_SoftwareStartConvCmd(ADC1,

ENABLE);

}}电压计算公式Voltage=ADCValue×3300÷4095•3300:参考电压3300mV(3.3V)•4095:12位ADC最大值(2^12-1)•ADCValue:ADC转换结果(0-4095)•结果单位:毫伏(mV)计算示例:ADCValue=2048Voltage=2048×3300÷4095≈1650mV通道切换逻辑当前通道:0下一通道:1ch=(ch+1)%2实现0和1循环切换通道配置:•ch=0:配置ADC_Channel_0(PA0)•ch=1:配置ADC_Channel_1(PA1)SYSTEMDEBUGGING系统联调与调试方法系统联调步骤软件工程编译完成后,将生成的hex目标代码文件加载到STM32F103芯片上。在调试工具中点击运行按钮启动程序,以验证系统功能。调试步骤1编译工程在Keil中编译工程,确保0错误0警告2加载程序将hex文件加载到STM32F103芯片3运行程序点击运行按钮,启动程序执行4功能验证调节电位器,观察LCD显示变化功能验证要点调节电位器测试调节电位器,使PA0和PA1的输入电压从低到高变化,观察LCD显示的通道编号、ADC转换值及电压值是否实时更新实时响应验证验证系统对电位器变化的实时响应能力,确保每次切换通道时LCD显示内容正确边界值测试测试0V和3.3V边界值,验证ADC转换的准确性常见问题排查•LCD无显示:检查GPIO配置和LCD初始化序列•ADC值不变化:检查中断是否触发,标志位是否正确设置•通道不切换:检查通道切换逻辑和通道配置函数•电压值不准确:检查参考电压和计算公式•系统崩溃:检查中断标志是否清除04CHAPTERFOUR任务总结知识梳理与能力提升巩固所学为后续学习做准备核心知识点技能提升绿色理念KEYKNOWLEDGEPOINTS核心知识点ADC多通道配置掌握ADC多通道扫描模式配置方法,理解GPIO模拟输入配置、ADC时钟设置、通道采样顺序配置等关键技术要点。中断触发机制理解中断触发机制与优先级设置,掌握EOC中断、JEOC中断、AWD中断三种触发类型的特点和应用场景。NVIC中断控制器掌握NVIC中断控制器的配置方法,理解抢占优先级和响应优先级的概念,能够合理设置中断优先级分组。查询方式vs中断方式理解查询方式与中断方式的区别,掌握中断方式的优势(CPU利用率高、实时响应)和适用场景。中断服务函数掌握中断服务函数的编写方法,理解中断标志检查、数据读取、标志清除等关键步骤,避免中断持续触发。LCD数据显示掌握LCD1602初始化和数据显示方法,理解整数到字符串的转换、电压值计算与显示等技术。学习成果:完成本任务后,能够独立实现ADC中断方式多通道电压采集系统,掌握中断驱动程序设计方法,为后续学习DMA、定时器等高级功能打下基础。SKILLS&GREENDESIGN技能提升与绿色低碳理念技能提升要点多通道电路设计设计多通道电压采集电路(如3路电位器输入),配置ADC扫描序列,实现更复杂的数据采集系统数据实时显示编写程序实现通道数据实时显示,如通过串口发送至PC端,使用上位机软件进行数据可视化调试能力提升通过逻辑分析验证中断触发时序,解决数据异常问题,提升嵌入式系统调试能力绿色低碳设计理念优化ADC采样率在保证精度的前提下降低采样频率以减少功耗,实现绿色设计。例如,对于温度监测应用,1秒采样1次即可满足需求中断驱动低功耗通过合理的中断配置,CPU在等待期间可以进入低功耗模式,降低系统能耗,延长电池供电设备的使用时间动态功耗管理根据实际应用需求动态调整采样频率,平衡精度与

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论