历史上的今天
返回首页

历史上的今天

今天是:2025年05月13日(星期二)

正在发生

2018年05月13日 | stm32ADC非DMA模式的多通道采集与注入通道的采集

2018-05-13 来源:eefocus

第一个为非DMA模式的多通道采集

void ADC_DMA_Config(void) 

{
ADC_InitTypeDef ADC_InitStructure;

RCC_HSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_DeInit(ADC1);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b; 
ADC_InitStructure.ADC_ScanConvMode = DISABLE;  //禁止扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; 
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
ADC_InitStructure.ADC_NbrOfConversion = 1;

ADC_Init(ADC1,&ADC_InitStructure);

/*没有采用中断和DMA方式,这样采样得到的数据很容易丢失,因为规则通道公用一个数据寄存器,因此需要在一个转换周期内读出数据,紧接着读取下一个通道的数据。*/

ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze);//推迟到转换后的数据被读取

ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);//在延迟和空闲阶段ADC是关闭的


/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Wait until the ADC1 is ready */
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)

}

}

uint16_t  GetADCValue(uint32_t CH_Data )//获取通道数据
{
    unsigned char  i;
    for(i=0; i<3; i++)
    {
        AD_Value[i] = 0xFF;
        switch (i)
        {
            case 0: ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_9Cycles); break;
            case 1: ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_9Cycles); break;
    default: ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_9Cycles); break;
        }
ADC_Cmd(ADC1, ENABLE);
       // ADC_TempSensorVrefintCmd(ENABLE);
        ADC_SoftwareStartConv(ADC1);
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) 
        AD_Value[i] = ADC_GetConversionValue(ADC1);
        ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
        ADC_SoftwareStartConv(ADC1);
        ADC_Cmd(ADC1, DISABLE);
    }
return AD_Value[CH_Data];
}


第二个为dma多通道采样与注入采样

__IO uint16_t ADC_ConvertedValue[2];//内存缓存adc通道数据

void ADC1_Mode_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;

/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//ADC地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址后移
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//半字
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);

/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);

/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立ADC模式
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;//转换通道数目
ADC_Init(ADC1, &ADC_InitStructure);


ADC_TempSensorVrefintCmd(ENABLE);
ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);


ADC_InjectedSequencerLengthConfig(ADC1, 1); //注入通道与其长度
  ADC_InjectedChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_7Cycles5);
// ADC_SetInjectedOffset(ADC1, ADC_InjectedChannel_1, 1000);//设置偏置电压值

ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);

ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部触发
ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE);
//ADC_AutoInjectedConvCmd(ADC1,ENABLE); //规则通道自动转换到注入通道
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

由下面代码可以得到注入通道ad值

ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//启动adc注入通道
while(RESET ==ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC));//等待转换完成
value=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//得到第一组的值

终于把ADC的非DMA的多通道采集完成,也是参考的网上的例子,学会了很多。其中要根据自己需求注意ADC是扫描模式,ADC是单次转换还是连续转换,还有ADC的模式也要注意。觉得ADC很博大精深,自己还得好好研究一番。


推荐阅读

史海拾趣

DYMO公司的发展小趣事

近年来,DYMO公司越来越注重环保和可持续发展。公司采用环保材料制造产品,并推广循环使用和回收计划。此外,DYMO公司还积极参与各种环保活动,致力于减少生产过程中的碳排放和废弃物排放。这些举措不仅提高了DYMO公司的社会形象,也为其未来的发展奠定了更加坚实的基础。

雅特力(Artery)公司的发展小趣事

雅特力深知人才是企业发展的核心力量。因此,公司始终重视人才培养和团队建设。雅特力通过招聘优秀的专业人才、开展内部培训、设立激励机制等方式,打造了一支高素质、高效率的团队。这支团队不仅具备丰富的技术知识和实践经验,还具备高度的创新意识和团队协作能力。正是有了这样一支优秀的团队,雅特力才能够在激烈的市场竞争中脱颖而出,实现持续稳健的发展。

DMC Tools公司的发展小趣事

随着全球对环保问题的日益关注,DMC Tools公司也积极响应号召,致力于绿色生产。公司引进了先进的环保设备和技术,对生产过程中的废弃物进行无害化处理。同时,公司还积极推广绿色产品,帮助客户实现绿色生产。这种对环保的关注和投入不仅彰显了公司的社会责任感,也为公司赢得了良好的社会声誉。

Hifn Inc公司的发展小趣事

DMC Tools公司高度重视人才培养和引进。公司定期举办各种培训活动,提高员工的技能水平和综合素质。同时,公司还积极引进高端人才,为公司的技术创新和产品研发提供有力支持。这些人才为公司的发展注入了新的活力,推动了公司的持续进步。

DBS Microwave Inc公司的发展小趣事

DBS Microwave Inc公司起源于XXXX年,当时由几位志同道合的电子工程师创立。他们共同意识到,随着无线通信技术的飞速发展,微波器件的市场需求将会急剧增长。于是,他们凭借丰富的专业知识和对市场趋势的敏锐洞察,决定专注于研发和生产高质量的微波射频器件。起初,公司面临着资金紧张、市场竞争激烈等诸多挑战,但创始人团队凭借坚韧不拔的精神和对技术的执着追求,逐步在市场上崭露头角。

意普(ESPE)公司的发展小趣事

随着工业自动化和智能化的不断发展,意普(ESPE)公司开始将光电保护技术与智能制造相结合,推出了多款智能光电保护产品。这些产品具有更高的检测精度和更快的反应速度,能够更好地保护操作人员的安全。同时,公司还积极参与工业互联网和物联网的建设,推动光电保护技术的智能化发展。

问答坊 | AI 解惑

数字地与模拟地连接的问题~

数字地和模拟地连接的时候为了防干扰,可以用0R的电阻相连,我问个老工程师他说用电阻连也不是很好,也可以用电容相连,我当时也没继续问,用电容相连的话,是不是两个地都要分别有个外接,还是用电容相连后,只把其中一个接地就可以了呢?   ...…

查看全部问答>

半导体散热片设计(pdf)

做电源离不了散热,理论基础来了;大家讨论下; …

查看全部问答>

PIC16F877 與RF CC2500程式???

各為大家好!!      我想請問一下      PIC16F877 與 RF CC2500 所結合的程式碼要如何寫呢??    (PIC16F877的資料經過RF傳輸     再由另一個RF接收資料)     ...…

查看全部问答>

由丰田召回说起

丰田大规模召回是汽车业内的一件大事,丰田一直以加速踏板受地垫阻碍不能返弹为由解释事故原因。这个理由受到质疑,这就有使问题进一步扩展的可能。据2010 Forecast: Toyota SUA Problems Continuing引述的一个车祸的例子,加速踏板受地毯 ...…

查看全部问答>

中国嵌入式系统产业协会第一期“嵌入式与物联网”主题论坛

中国嵌入式系统产业协会“嵌入式与物联网”主题论坛将延续原来中国嵌入式产业联盟“百家E坛”的形式,每月在北京举办一次,并陆续走入全国各地以及大专院校。目的是传播嵌入式技术、宣传物联网知识,推广嵌入式与物联网的项目和产品。并且每年举办 ...…

查看全部问答>

求方案(868MHz, 300m)

各位大侠好, 我现在要做一个东西,要求用868MHz,距离能达到300米, 数据量不大, 请各位大牛们给我出个点子,对成本有要求,性能保证的情况下能低就低。 多谢大家了!…

查看全部问答>

AVR最基本问题

   我用attiny13做了一个电路板,想调一下,可软件不听我的,我安装了AVR STDIO 4,安装了其它的c软件,都不能编译,又都卸掉了,安装了winavr,勉强能编译但还是不通过.出现错误为: ../../../../crt1/gcrt1.S:52: undefined reference to `main ...…

查看全部问答>

Modelsim 中时序仿真的问题

用Modlsim对设计做功能仿真,正确。然后在QuarusII 中对设计加约束,生成 .sdc 文件,然后编译。生成的网表文件 .vo 再放回到Modelsim中,用功能仿真相同的 testbench 做时序仿真,可是仿真波形不正确,请问是为什么?补充一下:做功能仿真,时钟用 ...…

查看全部问答>

电路板级的电磁兼容设计

本应用文档从元件选择、电路设计和印制电路板的布线等几个方面讨论了电路板级的电磁兼容性(EMC)设计。 本文从以下几个部分进行论述:第一部分:电磁兼容性的概述第二部分:元件选择和电路设计技术第三部分:印制电路板的布线技术附录A:电磁兼容 ...…

查看全部问答>

"解bug"活动获奖网友

(目前已更新) 本期的解bug活动共有五位网友获奖 解bug活动链接https://bbs.eeworld.com.cn/thread-414389-1-1.html 这次的活动要求大家能够尽量的将自己的BUG或者解决办法讲述清楚 以下五位网友分别是: 一等奖(空缺) 本来是希望将一等奖 ...…

查看全部问答>