代码结构分析
在分析完电路的基础上,我主要把代码分为两个层面。
1、ADC采样后的数据处理。算出P、I、U。
2、将处理好的数据显示在LCD上,并用曲线表示出P的变化。
这一节主要讲第一个层面,也就是:1、ADC采样后的数据处理。算出P、I、U。
首先是配置ADC,由于我们要采样两个不同的电压,所以使用双重ADC采样。关于双重ADC采样,细讲起来太多了,可以去参考网上其它大佬和公众号给出的介绍,这里我给一个配置代码和过程分析。我们使用ADC1的通道11(对应STM32ZET6的PC1引脚)采集电源电压,使用ADC2的通道14(对于PC4)采集已知电阻两端电压。配置过程如下。
//这是ADC配置的.c文件
#include "adc_DMA.h"
#include "stm32f10x.h"
/****************************************************************************************************************
本实验用到双重ADC,ADC1采集电源电压,ADC2采集已知电阻两端电压,存储到ADC1的数据寄存器DR,两个ADC的数据通过一个DMA通道传输,
传输到ADC_ConvertedValue中,经过数据处理后将两个数据分离分别存储到ADC_1_ConvertedValue,ADC_2_ConvertedValue中。
*****************************************************************************************************************/
__IO uint32_t ADC_ConvertedValue=0;//用于存储DMA传输过来的32位数据
__IO uint16_t ADC_1_ConvertedValue=0;//存储ADC1转换的数据
__IO uint16_t ADC_2_ConvertedValue=0;//存储ADC2转换的数据
/*******************
ADC_GPIO初始化
*******************/
static void ADC_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//ADC1_GPIO初始化,PC1对应ADC1通道11
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//ADC模式一定要配置成模拟输入模式
GPIO_Init(GPIOC,&GPIO_InitStructure);
//ADC2_GPIO初始化,PC4对应ADC2通道14
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
/*******************
ADC工作模式配置
1、ADC1 对应 DMA1通道1,ADC3对应DMA2通道5,ADC2没有DMA功能
2、双模式时,ADC1和ADC2转换的数据都存放在ADC1的数据寄存器,ADC1的在低十六位,ADC2的在高十六位
3、双ADC模式的第一个ADC,必须是ADC1,双ADC模式的第二个ADC,必须是ADC2
*******************/
static void ADC_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitSturcture;
//开启ADC和DMA相关时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE