您的位置 首页 分销

stm32 ADC的规矩通道和注入通道混合运用

之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用…

之前完结了规矩通道DMA的数据传输了,不过平常在运用ADC的时分或许就会遇到许多状况,不或许就这样简略的按规矩通道来采样,DMA存储,运用数据的;或许有时分会需求马上采样,那样咱们就需求运用到注入通道了。文档关于注入通道的解说:

1      运用外部触发或经过设置ADC_CR2寄存器的ADON位,发动一组规矩通道的转化。 2      假如在规矩通道转化期间发生一外部注入触发,当时转化被复位,注入通道序列被以单次扫描方法进行转化。 3      然后,康复前次被中止的规矩组通道转化。假如在注入转化期间发生一规矩事情,注入转化不会被中止,可是规矩序列将在注入序列完毕后被执行。
  将变阻器的那路ADC设置为注入通道:
1  ADC_InjectedSequencerLengthConfig(ADC1, 1);\\设置注入通道长度2  ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);\\装备注入通道3  ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);\\开端注入通道数据采样和转化
  开端之后,推迟满足的时刻,让ADC采样和转化完结。
用ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);读取注入通道1的数据,成果发现数据一向不变,那肯定是哪里设置出错了,找了下他人的设置,并做了一些测验,发现了原来是设置的问题,注入采样的触发方法没有设置:
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
这个函数设置注入方法运用软件触发方法,设置完之后用开端采样和读取数据函数,就能采到正确的数据。
上面的比如运用触发注入完结的,下面又测验了主动注入。这样每次进行规矩通道采样时,也会顺便把注入通道也进行采样了,而发动注入通道采样则不会对规矩通道进行采样。
假如设置了 JAUTO 位,在规矩组通道之后,注入组通道被主动转化。这可以用来转化在 ADC_SQRx 和 ADC_JSQR 寄存器中设置的多至 20 个转化序列。
还有在规矩通道运用DMA数据传输,且运用注入通道采样时,不知道会不会对数据有影响?
查了下文档,只要在规矩通道的转化完毕时才发生 DMA 恳求,并将转化的数据从 ADC_DR 寄存器传输到用户指定的意图地址,还有注入方法转化后数据存储到 ADC_DRJx寄存器和规矩方法转化后数据存储在ADC_DR寄存器中。
  在注入通道和规矩通道的混合运用中,我花了不少时刻去找正确的设置,问题是不知道哪些库函数是必要的,哪些对错必要的,后来对着比如测验之后才知道。后边我还想了解下详细的寄存器设置,看了几个初始化的函数,发现其实许多设置都是对ADC_CR1的设置,有不少不明白的看了寄存器就知道了,看来函数的运用仍是要和寄存器对应的位结合起来,这样才干了解的透彻点。
  下面是我整个代码的设置,其他设置和上篇比如相同,只改了ADC设置:

[cpp]view plaincopy

  1. staticvoidProtect_AdcInit(void)
  2. {
  3. ADC_InitTypeDefADC_InitStructure;
  4. ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
  5. ADC_InitStructure.ADC_ScanConvMode=ENABLE;
  6. ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
  7. ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//软件触发
  8. ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
  9. ADC_InitStructure.ADC_NbrOfChannel=2;//规矩通道的数量
  10. ADC_Init(ADC1,&ADC_InitStructure);//这个大部分是初始化规矩通道的
  11. ADC_TempSensorVrefintCmd(ENABLE);
  12. ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,1,ADC_SampleTime_239Cycles5);
  13. ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,2,ADC_SampleTime_239Cycles5);
  14. ADC_InjectedSequencerLengthConfig(ADC1,1);
  15. ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);
  16. ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None);//设置规矩通道软件触发
  17. /*Enableautomaticinjectedconversionstartafterregularone*/
  18. //ADC_AutoInjectedConvCmd(ADC1,ENABLE);
  19. ADC_DMACmd(ADC1,ENABLE);
  20. /*EnableADC1externaltrigger*/
  21. ADC_ExternalTrigConvCmd(ADC1,DISABLE);
  22. ADC_ExternalTrigInjectedConvCmd(ADC1,DISABLE);
  23. ADC_Cmd(ADC1,ENABLE);
  24. ADC_ResetCalibration(ADC1);
  25. while(ADC_GetResetCalibrationStatus(ADC1));
  26. ADC_StartCalibration(ADC1);
  27. while(ADC_GetCalibrationStatus(ADC1));
  28. }

======================没完,持续=================

读取数据在这里:

/* 注入转化中止 */
void ADC1_2_IRQHandler(void)
{
s32 inj_v1,inj_v2,inj_v3,inj_v4;

if(ADC_GetITStatus(ADC1,ADC_IT_JEOC) == SET){
ADC_ClearITPendingBit(ADC1,ADC_IT_JEOC);
inj_v1 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
inj_v1 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_4);
inj_v1 >>= 1;

inj_v2 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
inj_v2 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_3);
inj_v2 >>= 1;

inj_v3 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_3);
inj_v3 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_2);
inj_v3 >>= 1;

inj_v4 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_4);
inj_v4 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_1);
inj_v4 >>= 1;
}
}

/* 规矩转化中止 */
void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC1) == SET){
DMA_ClearFlag(DMA1_FLAG_TC1);
DMA_ClearITPendingBit(DMA1_IT_GL1);
ADC_SoftwareStartConvCmd(ADC1,DISABLE);
DMA_Cmd(DMA1_Channel1,DISABLE);

/* ¼ÆËãת»»Öµ */
regular_convert_calc();

/* Æô¶¯ÏÂÒ»´Î´«Êä */
DMA1_Channel1->CNDTR = NUM_OF_REG_CHANNEL;
DMA_Cmd(DMA1_Channel1,ENABLE);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
}

还有这篇说的也不错:用TIM1发生6路ADC,用CCR4触发ADC1的注入通道采样

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/275386.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部