历史上的今天
返回首页

历史上的今天

今天是:2024年09月07日(星期六)

2020年09月07日 | PIC18F,ADC多通道采集,定时采集

2020-09-07 来源:eefocus

程序说明:


处理器:PIC18F66K80系列


系统频率:32M (外部晶振8M,4倍频得到)


通道:AN1,AN2,AN3


源文件


#include "bsp.h"

 

/*

*********************************************************************************************************

* 函 数 名: ADC_Init

* 功能说明: ADC初始化

* 形    参: 无

* 返 回 值: 无

*********************************************************************************************************

*/

void ADC_Init() 

    TRISA = 0xFF; //PORTA as input

    ANCON0 = 0X0F; //引脚配置为模拟通道

    

    ADCON1 = 0x00; // 外部正参考电压,AVdd为负电压,模拟反相通道为AVss

    ADCON2 = 0xAA; // FOSC/32 as conversion clock, Result is right justified,Aquisition time of 12 TAD 

    ADRESH = 0;

    ADRESL = 0;

    ADC_StartConversion(ADC_CHS_1);

}

 

 

/*

*********************************************************************************************************

* 函 数 名: ADC_GetConversionValue

* 功能说明: ADC读取

* 形    参: 无

* 返 回 值: ADC通道采集结果

*********************************************************************************************************

*/

uint16_t ADC_GetConversionValue()

{

    uint16_t ADC_Result = 0;

 

    // Conversion finished, return the result

    ADC_Result = (uint16_t)ADRESH << 8|(ADRESL&0xE0);

 

    return ADC_Result; //Returns Result

}

/*

*********************************************************************************************************

* 函 数 名: ADC_StartConversion

* 功能说明: ADC启动转换

* 形    参: channel,采集通道 

* 返 回 值: 无

*********************************************************************************************************

*/

void ADC_StartConversion(uint8_t channel) 

{

    // select the A/D channel

    ADCON0bits.CHS = channel;

    // Turn on the ADC module

    ADCON0bits.ADON = 1;

    // Acquisition time delay

    //__delay_us(ACQ_US_DELAY);

 

    // Start the conversion

    ADCON0bits.GO_NOT_DONE = 1;

}

头文件

/* 

 * File:   adc.h

 * Author: Administrator

 *

 * Created on 2017年7月11日, 下午4:33

 */

 

#ifndef ADC_H

#define ADC_H

 

 

#ifdef __cplusplus

extern "C" {

#endif

// 转换通道个数

#define    ADC_CHS_NUM     3

#define    ADC_SAMP_CNT             3

    

#define    ACQ_US_DELAY             5//ADC采集延时时间

 

 

#define    ADC_CHS_1             0x01//AN1采集通道

#define    ADC_CHS_2        0x02//AN2采集通道

#define    ADC_CHS_3        0x03//AN3采集通道

 

void ADC_Init();

uint16_t ADC_GetConversionValue();

void ADC_StartConversion(uint8_t channel); 

#ifdef __cplusplus

}

#endif

 

#endif /* ADC_H */

应用函数

应用函数放在主循环定时1ms调用,1ms切换一次采集通道,1ms后读取上一通道的采集结果。


/*

*********************************************************************************************************

* 函 数 名: AdcPro

* 功能说明: ADC滤波处理

* 形    参: 无

* 返 回 值: 无

*********************************************************************************************************

*/

void AdcPro(void)

{

static uint16_t buf[ADC_SAMP_CNT][ADC_CHS_NUM];

static uint8_t write;

    static uint8_t index = ADC_CHS_1;

uint16_t sum;

uint8_t i;

    

    if(index == ADC_CHS_1)//通道1采集

    {

        buf[write][ADC_CHS_1] = ADC_GetConversionValue();

        

        /* 下面这段代码采用求平均值的方法进行滤波

            也可以改善下,选择去掉最大和最下2个值,使数据更加精确

        */

        sum = 0;

        for (i = 0; i < ADC_SAMP_CNT; i++)

        {

            sum += buf[i][ADC_CHS_1];

        }

        SysRunData.ADC_Buf[ADC_CHS_1] = sum / ADC_SAMP_CNT; /* ADC采样值由若干次采样值平均 */

      

        index = ADC_CHS_2;

        ADC_StartConversion(ADC_CHS_2); /* 软件启动下次ADC转换 */

    } 

    else if(index == ADC_CHS_2)//通道2采集

    {

        buf[write][ADC_CHS_2] = ADC_GetConversionValue();

 

        /* 下面这段代码采用求平均值的方法进行滤波

            也可以改善下,选择去掉最大和最下2个值,使数据更加精确

        */

        sum = 0;

        for (i = 0; i < ADC_SAMP_CNT; i++)

        {

            sum += buf[i][ADC_CHS_2];

        }

        SysRunData.ADC_Buf[ADC_CHS_2] = sum / ADC_SAMP_CNT; /* ADC采样值由若干次采样值平均 */

 

        index = ADC_CHS_3;

        ADC_StartConversion(ADC_CHS_3); /* 软件启动下次ADC转换 */

    }

    else if(index == ADC_CHS_3)//通道3采集

    {

         buf[write][ADC_CHS_3] = ADC_GetConversionValue();

        /* 下面这段代码采用求平均值的方法进行滤波

            也可以改善下,选择去掉最大和最下2个值,使数据更加精确

        */

        sum = 0;

        for (i = 0; i < ADC_SAMP_CNT; i++)

        {

 

 

            sum += buf[i][ADC_CHS_3];

        }

        SysRunData.ADC_Buf[ADC_CHS_3] = sum / ADC_SAMP_CNT; /* ADC采样值由若干次采样值平均 */

        if (++write >= ADC_SAMP_CNT)

        {

            write = 0;

        }                         

        index = ADC_CHS_1;

        ADC_StartConversion(ADC_CHS_1); /* 软件启动下次ADC转换 */

    }  

}


推荐阅读

史海拾趣

ALD [Advanced Linear Devices]公司的发展小趣事

ALD(Advanced Linear Devices)是一家专注于模拟半导体器件和电源解决方案的公司。以下是关于ALD公司发展的5个相关故事:

  1. 公司成立与创始人: ALD公司成立于1985年,总部位于美国加州的米尔皮塔斯市。该公司由俄罗斯裔工程师及企业家Vladimir Larkhov先生创立。Larkhov先生在半导体领域有着丰富的经验和深厚的技术底蕴,他创立ALD旨在为市场提供高品质、高性能的模拟集成电路和解决方案。

  2. 技术创新与专利: ALD公司以其在模拟半导体领域的技术创新而闻名。该公司拥有众多的专利,涵盖了多个关键技术领域,包括功率管理、电源管理、精密电压参考和模拟信号处理等。这些专利为ALD提供了技术壁垒,保护了其在市场上的地位。

  3. 产品线与市场应用: ALD公司的产品涵盖了模拟集成电路(ICs)、功率管理芯片、电源解决方案等领域。其产品被广泛应用于工业控制、医疗设备、汽车电子、通信设备、消费类电子产品等多个市场领域。ALD产品的高性能、高可靠性得到了客户的认可和信赖。

  4. 全球业务拓展: 随着全球市场的不断扩大,ALD公司不断加大对海外市场的开拓力度。除了在美国设立总部和研发中心外,ALD还在亚洲、欧洲等地设立了销售办事处和合作伙伴,以便更好地服务全球客户。

  5. 不断创新与发展: ALD公司一直致力于不断创新和发展,不断推出具有竞争力的新产品和解决方案,以满足客户不断变化的需求。公司注重技术研发和人才培养,拥有一支技术过硬、富有创新精神的团队,为公司的持续发展提供了强有力的支持。

这些故事展现了ALD公司在技术创新、产品应用、全球业务拓展和持续发展等方面的发展历程和成就。

ASC Capacitors公司的发展小趣事

ASC Capacitors始终坚持品质至上的原则。公司从原材料采购到生产工艺,再到产品出厂,每一个环节都严格把控,确保产品质量无可挑剔。此外,ASC Capacitors还建立了完善的质量检测体系,对每一批产品进行严格测试,确保产品性能达到最佳状态。正是这种对品质的执着追求,使得ASC Capacitors赢得了客户的广泛赞誉和信任。

AK-Nord_GmbH公司的发展小趣事

为了确保产品质量和客户满意度,AK-Nord_GmbH投入大量资源建设质量管理体系。公司引入了国际先进的质量管理标准和流程,对产品的研发、生产、测试等各个环节进行严格把控。同时,公司还建立了完善的客户服务体系,及时响应客户需求和处理问题。这些举措有效提升了公司的产品质量和客户满意度,为公司赢得了良好的口碑。

安国国际(ALCOR)公司的发展小趣事

安国国际在创立初期便展现出强大的研发实力。1997年,公司成功推出了世界第一颗单一整合的USB键盘集线器控制IC,这一创新成果奠定了安国在IC专业设计领域的领导地位。随后,在1998年,安国将总部迁往台湾,以便为全球客户提供更及时的技术支持和服务,同时与晶圆代工厂紧密配合,确保产品质量和技术水平。

Eurotech公司的发展小趣事

为了满足不断变化的市场需求,Eurofarad公司始终保持着对产品创新的热情。公司不断投入研发资源,开发出了一系列具有竞争力的新产品。这些新产品不仅涵盖了不同规格和性能的电容器,还包括了一些与电容器相关的配套产品和解决方案。这些创新产品的推出,让Eurofarad公司在市场中保持了领先地位。

Boundary Devices公司的发展小趣事

作为一家有社会责任感的企业,Boundary Devices始终关注环境保护和可持续发展。公司在生产过程中积极采用环保材料和技术,减少对环境的影响。同时,公司还积极参与社会公益活动,为社会的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

以上五个故事基于Boundary Devices公司的发展背景和电子行业的一般趋势进行创作,旨在展示该公司在不同阶段的成长与发展。然而,实际的公司发展历程可能更加复杂和丰富,需要更多的资料和信息来深入了解。

问答坊 | AI 解惑

基于单片机的酒瓶自动计数系统的设计

大家好啊,在这转悠了好几天,发现大家都是高手!我是一名专升本的学生,专科没有学过单片机本科学校因为大部分人都学过所以也就没开这门课,现在要做有关单片机的毕业设计,想请大家帮帮忙,谢谢了!     昨天问了一下老师那个设计一共 ...…

查看全部问答>

Altera的用IP核设计的信号发生程序

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 Altera的用IP核设计的信号发生程序  …

查看全部问答>

如何将SMDK2440变成多个版本?例如我的产品210,对应的BSP是smdk2440210,产品220对应的是smdk2440220

本人菜鸟,现在碰到一个问题,希望向大家求助一下. 现在我的wince目录中的PLATFORM只有smdk2440一个bsp,这样产生了很多不方便的地方. 第一,目前有3个系列的产品,虽然都是基于2440的,但是在BSP上,还是有些地方是不同的,要维护这三个系列的产品.虽然 ...…

查看全部问答>

如何将ucfs文件系统植入nios ii工程中?

各位大侠:    ucfs导入nios ii工程后,编译时文件一直出错。求移植的具体步骤。不胜感激!…

查看全部问答>

VC6++封装成exe文件的问题

一直用VC++6做编译器,虽然有人让我换了,我嫌麻烦一直没换。用它写程序调试程序一切都很正常,唯独有个问题。把写好的程序封装成exe文件。具体的操作其实挺简单(当然没有命令行下简单)首先写代码,编译看有没有错误,没错误以后封装。封装方法是 ...…

查看全部问答>

小光棍节的礼物!让QVGA屏普及吧!2.4寸 QVGA TFT屏带触摸屏15元一个!

让QVGA屏普及吧!2.4寸 QVGA TFT屏带触摸屏15元一个(5个起),全新37脚ILI9320驱动,提供程序! 单个20元一个,数量不多欢迎抢购!     [ 本帖最后由 shanyan 于 2011-11-1 23:04 编辑 ]…

查看全部问答>

msp430g2553如何使外接的ch451控制8位数码管显示?

其实就是要AD采集的电压数据显示在数码管上,可这个数码管是通过CH451外接的,该怎么编程呢? …

查看全部问答>

我自己构建了CCSV5的工程,编译后总是提示如下错误

我自己构建了CCSV5的工程,编译后总是提示如下错误,我查了很多资料,都没有解决,能给我解决和解释一下吗,谢谢 …

查看全部问答>