芯片型号:STM32F103VE
首先实验单个ADC的规则通道和注入通道。
1个ADC两个通道:
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//非单通道
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
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_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
return ADC_GetConversionValue(ADC1);
1个ADC,两个规则通道一个注入通道(软件启动):
在上面配置的基础上加入注入通道的代码:
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);//不用中断事件启动
ADC_InjectedSequencerLengthConfig(ADC1, 1);//通道长度
ADC_InjectedChannelConfig(ADC1,ADC_Channel_15,1,ADC_SampleTime_28Cycles5);//配置注入组,这里的通道选实际的ADC通道
ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,0);//偏移,这里的注入通道共有1-4四条
ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//软件启动转换
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//获取注入通道1的转换结果
值得注意的是要仔细阅读库函数的注释说明,若将ADC_InjectedChannel_1错填成ADC的实际的通道ADC_Channel_15就不行了(编译器不会报错)。
ADC_SampleTime_239Cycles5是采样时间,采样时间越长越精确。
ADC_InjectedSequencerLengthConfig(ADC1, 1);与规则通道配置类比,结合注释猜想应该是有几个注入通道的意思。
ADC_SetInjectedOffset(ADC1,ADC_InjectedChannel_1,0);注入通道转换数据的偏移,转换结果为原始数据减去偏移量。例如写偏移为1000,转换结果便从原来的两千多变为一千多了。
简单说明一下ADC初始化配置的结构体:
typedef struct
{
uint32_t ADC_Mode; /*设置ADC模式 。有独立模式和其他好几个模式(两个及以上ADC)*/
FunctionalState ADC_ScanConvMode; /*设置是否开启扫描模式,即单通道或多通道*/
FunctionalState ADC_ContinuousConvMode; /*设置是否开启连续转换模式,即只转换一次或者连续转换*/
uint32_t ADC_ExternalTrigConv; /*设置启动规则转换组转换的外部事件,即软件触发转换还是外部事件触发*/
uint32_t ADC_DataAlign; /*设置 ADC 数据对齐方式是左对齐还是右对齐*/
uint8_t ADC_NbrOfChannel; /*设置规则序列的长度,即有几个通道*/
}ADC_InitTypeDef;
ADC_Mode:在有两个及以上ADC的MCU,可使用双ADC模式,通过这些模式的选择决定是主从交替触发或同步触发。
#define ADC_Mode_Independent 独立模式,一个ADC
#define ADC_Mode_RegInjecSimult 同步注入+同步规则
#define ADC_Mode_RegSimult_AlterTrig 同步规则+交替触发
#define ADC_Mode_InjecSimult_FastInterl 同步注入+快速交替
#define ADC_Mode_InjecSimult_SlowInterl 同步注入+慢速交替
#define ADC_Mode_InjecSimult 同步注入
#define ADC_Mode_RegSimult 同步规则
#define ADC_Mode_FastInterl 快速交替
#define ADC_Mode_SlowInterl 慢速交替
#define ADC_Mode_AlterTrig 交替触发
同步即同时触发多个ADC的转换,交替是不同时触发的。详细解释参看参考手册。
下面实验双ADC:
同步规则:
只需将模式改成同步规则,添加进ADC2的初始化代码(凡带有ADC1的都复制一遍),然后读取结果即可。
注意不要转换两个ADC的相同通道。
同步注入:类似改法。