【嵌入式】HC32F定时器PWM捕获+APC芯片实现模拟AD采样

news2024/9/17 7:15:57

目录

一 项目背景

二 原理说明

三 设计实现——定时器初始化

四 设计实现——PWM捕获

五 梳理总结


一 项目背景

        目前使用了TI的ADC采样芯片ADS1018实现模拟量4-20mA/0-20mA的采样,原理是将外部输入的模拟量信号4-20mA,经由并联的两个100Ω电阻,转换为0.2-1V的电压信号传递到模数转换芯片的入口,再由ADS1018(全量程设置为FS=±1.024V,对应码为0x7FF)将0.2-1V电压信号转换为数据码0x190-0x7D0(400-2000),即可以将外部输入4-20mA与内部采集数据400-2000对应上,如下图所示:

        但是限于成本和货期的问题,考虑将该款ADC换成国产的其他方案。

        又因为这边AD采样的是DCS或者PLC发出来的4-20mA/0-20mA信号,必须需要外加隔离,所以不能采用MCU自带的ADC外设直接采样的方案(MCU的ADC外设没有隔离功能,必须外接隔离芯片才行),所以该方案舍弃。

        找到一款客益电子(http://www.guestgood.com/)的APC/PAC芯片,可以将输入的模拟信号转化为PWM波的占空比输出,这边选用的APC芯片为GP9101。

二 原理说明

【1】APC/PAC芯片原理:

        A=Analog,P=PWM,C=Convertor。

        APC=Analog to PWM Convertor 是一种模拟信号转PWM信号的专用芯片,PAC=PWM to Analog Convertor是一种PWM信号转模拟信号的专用芯片。

        在信号调理领域,经常需要面对模拟量信号的传输、采集、控制等问题,传统的信号链芯片包括模数转换器(ADC)、数模转换器(DAC)、运算放大器(OpAmp)、比较器(Comparator)等等,它们扮演着模数混合信号处理的主要角色。信号链芯片的功能基础而强大,经过精心的设计后能形成多种多样优秀的信号处理电路。但即便如此,在很多应用领域,传统的信号链芯片依然存在瓶颈和制约,无法达到理想的电路性能和技术指标,尤其在一些需要PWM信号的领域,传统的方法遇到许多困难。

        客益电子发明了一种新型的模拟信号处理的专用芯片,它实现了模拟信号与PWM信号间的高精度转换功能,我们称它为APC(Analog to PWM Convertor)和PAC(PWM to Analog Convertor)。 

 

【2】芯片特性:

        这边采用的芯片GP9101将输入0-VCC的信号转化为占空比0-100%,频率默认为1KHz的PWM波输出

 

【3】采样原理:

        参考上面ADC采样的思路,将外部输入的模拟量信号4-20mA,经由并联的两个400Ω电阻,转换为0.8-4V的电压信号传递到APC芯片的入口,再由GP9101(供电Vcc=5V)将0.8-4V电压信号转换为占空比为16-80%的PWM交由MCU进行捕获,即可以将外部输入4-20mA与内部采集数据对应上,如下图所示:

三 设计实现——定时器初始化

        由上面的方案,首先需要实现的是定时器捕获PWM功能的初始化,我这边使用的主控芯片为小华的HC32F460,选用其高级控制定时器Timer6进行PWM捕获,端口选用B13,其功能是TIMER6_1_PWMB(Timer6的1单元B通道):

        初始化程序如下:

/* TIMER6 unit and clock definition */
#define TIMER6_UNIT1                    (M4_TMR61)
#define TIMER6_UNIT1_CLOCK              (PWC_FCG2_PERIPH_TIM61)
/* TIMER6 channel B Port/Pin definition */
#define TIMER6_UNIT1_CHB                (Timer6GenCompareB)
#define TIMER6_UNIT1_CHB_PORT           (PortB)
#define TIMER6_UNIT1_CHB_PIN            (Pin13)
#define TIMER6_UNIT1_CHB_FUNC           (Func_Tim6)


void Timer6_APC_Config(void)  //APC测试,采样0.8V-4V电压,APC输出16%-80%占空比,经过64分频定时器捕获,输出比较值为420-2100(输入K/B需要调整为2100/400)
{
    stc_timer6_basecnt_cfg_t         stcTIM6BaseCntCfg;
    stc_timer6_port_input_cfg_t      stcTIM6CapxCfg;
    
    MEM_ZERO_STRUCT(stcTIM6BaseCntCfg);
    MEM_ZERO_STRUCT(stcTIM6CapxCfg);
    
    PWC_Fcg2PeriphClockCmd(TIMER6_UNIT1_CLOCK, Enable);
    
    PORT_SetFunc(TIMER6_UNIT1_CHB_PORT, TIMER6_UNIT1_CHB_PIN, TIMER6_UNIT1_CHB_FUNC, Disable);    //Timer61 PWMA
    
    stcTIM6BaseCntCfg.enCntMode   = Timer6CntSawtoothMode;              //Sawtooth wave mode
    stcTIM6BaseCntCfg.enCntDir    = Timer6CntDirUp;                     //Counter counting up
    stcTIM6BaseCntCfg.enCntClkDiv = Timer6PclkDiv64;                   //Count clock: pclk0/64(256分频也可以试一试)
    Timer6_Init(TIMER6_UNIT1, &stcTIM6BaseCntCfg);                          //timer6 PWM frequency, count mode and clk config

    Timer6_SetPeriod(TIMER6_UNIT1, Timer6PeriodA, 0xFFFFu);               //Period set

    stcTIM6CapxCfg.enPortSel  = Timer6xCHB;                            //Capture Input Port: PWM B port
    stcTIM6CapxCfg.enPortMode = Timer6ModeCaptureInput;                //Capture input function
    stcTIM6CapxCfg.bFltEn     = true;                                  //Input filter enable
    stcTIM6CapxCfg.enFltClk   = Timer6FltClkPclk0Div16;                //Filter clock
    Timer6_PortInputConfig(TIMER6_UNIT1, &stcTIM6CapxCfg);                 //Input config

    Timer6_ConfigHwCaptureB(TIMER6_UNIT1, Timer6HwTrigPWMBRise);       //HW Capture: Timer6 PWMB port rise trig

    Timer6_ConfigHwClear(TIMER6_UNIT1, Timer6HwTrigPWMBFall);          //HW Clear: Timer6 PWMB port fall trig
    Timer6_EnableHwClear(TIMER6_UNIT1);
    
    /*start timer6*/
    Timer6_StartCount(TIMER6_UNIT1);
}

四 设计实现——PWM捕获

        因为输入到MCU的PWM频率为1KHz,所以捕获定时器的周期值为:

Period = 168000000 / 2 / 64 / (1000 / 2) = 2625

                                                        主频                分频    输入频率

        捕获到的PWM比较值即为:

Compare = Period * Duty

        所以由上面方案中采样到的4-20mA对应的占空比16-80%,计算得到的比较值即为:

Compare_4mA = Period * Duty = 2625 * 16% = 420

Compare_20mA = Period * Duty = 2625 * 80% = 2100

        程序中的PWM捕获采用Timer6_GetGeneralCmpValue接口:

/**************************************************************************
* 函数名称: analogInputHandle
* 功能描述: 模拟量输入处理
* 输入参数:
* 输出参数:
* 返 回 值:
* 其它说明:
**************************************************************************/
float analogInputHandle(STRU_ANALOG_IO_CTRL *p_analog_ctrl)
{
    //...
    //这边捕获到的比较值是根据输入进来的PWM计算得到的
    remote_ctrl.AI1_read = Timer6_GetGeneralCmpValue(TIMER6_UNIT1, TIMER6_UNIT1_CHB);
    //...
}

        采集得到的remote_ctrl.AI1_read再经过公式(本例中,K=2100,B=420),对应得到4-20:

y=(x-B)*\frac{16}{K-B}+4

 

五 梳理总结

        这个APC替代ADC用于采样模拟量输入的方案,使用比较简单方便,但是精度并没有之前使用的ADS1018(12位精度)那么好,适用于对精度要求不高的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/454559.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day-01 one-day projects

个人名片: 😊作者简介:一名大一在校生,web前端开发专业 🤡 个人主页:python学不会123 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习…

AIGC席卷,抖快、阅文、知乎大战网文圈

配图来自Canva可画 成熟的网文市场,时不时进来一条鲶鱼。 经历了二十几个夏秋秋冬,网文市场形成了阅文、晋江、七猫、番茄等平台割据一方稳定的市场格局。后来暗自布局网文市场的知乎、抖音、快手等新玩家开始浮出水面,未来的市场纷争下或许…

Docker持久化方式-v和-volume的区别

docker数据的持久化一直用的是-v的方式,又叫Bind Mounts(目录绑定),偶然间发现还有一种通过卷轴来实现持久化的方式,翻了下资料,整理了一下两种方式使用的场景。 -v(Bind Mounts) …

使用 Apache PDFBox 操作PDF文件

简介 Apache PDFBox库是一个用于处理PDF文档的开源Java工具。该项目允许创建新的PDF文档,操作现有PDF文档,并从PDF文档中提取内容。Apache PDFBox还包括几个命令行实用程序。 Apache PDFBox的主要功能如下: 从PDF文件中提取Unicode文本。将…

浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术

浅析提高倾斜摄影超大场景的三维模型轻量化的数据质量关键技术 倾斜摄影超大场景的三维模型轻量化的质量关键技术主要包括: 1、保持数据精度。在进行轻量化处理时,必须确保数据的精度不受损失,否则会影响后续分析和应用方案。因此&#xff0…

接口测试不再难。这篇文章让你在5分钟内掌握接口自动化测试用例

目录 摘要: 一、背景 二、测试用例设计 三、测试脚本实现 四、最佳实践和技巧 总结 摘要: 本文介绍了接口自动化测试的重要性,并提供了一个简单的测试用例,涵盖了设计、条件、步骤和数据方面的考虑。通过使用Python中的req…

C/C++|物联网开发入门+项目实战|函数输入与输出|值传递|地址传递|连续空间的传递|嵌入式C语言高级|C语言函数的使用(1)-学习笔记(11)

文章目录 函数概述输入参数示例:值传递地址传递连续空间的传递 参考: 麦子学院-嵌入式C语言高级-C语言函数的使用 函数概述 一堆代码的集合,用一个标签去描述它 复用化,降低冗余度 标签 ------ 函数名 函数和数组都属于内存空间&#xff0c…

C语言system讲解

‘system’是C语言标准库中的一个函数,它的作用是对计算机系统进行操作,如创建文件夹,打开文件夹,清空屏幕等等,下面介绍一下常用的几个system命令 system函数原型 int system(const char* command); command是字符…

联发科的好日子结束,出货量暴跌,高通稳住阵脚并开始反击

在手机芯片市场连续3年时间顺风顺水之后,联发科终于迎来了高通的反击,特别是骁龙8G2的发布更是导致联发科在手机芯片市场的步步后退,推动了高通的反弹。 一、形势有利于高通 高通此前的骁龙8G1和骁龙888因出现发热问题,因此被誉为…

4. 线性表

4. 线性表 线性表是最基本、最简单、也是最常用的一种数据结构(逻辑结构)。一个线性表是n个具有相同特性的数据元素的有限序列。 前驱元素: 若A元素在B元素的前面,则称A为B的前驱元素 后继元素: 若B元素在A元素的后面,则称B为…

【翻译一下官方文档】之uniapp的界面弹框交互

大致分 3 种 普通提示loading框弹出选项 我个人理解就是大致知道有些什么,有啥功能,用到的时候,直接去用,不会的回来翻看文档 uni.showToast(OBJECT) 参数类型必填说明平台差异说明titleString是提示的内容,长度与…

C++ 多态详解

目录 多态的概念 定义 C直接支持多态条件 举例 回顾继承中遇到的问题 虚函数-虚函数指针-虚函数列表 虚函数 虚函数指针 虚函数列表 虚函数调用流程 虚函数于普通成员函数的区别 多态的概念 定义 多态:相同的行为方式导致了不同的行为结果,同一行…

【翻译一下官方文档】之uniapp的.sync修饰符

先用一个案例引出.sync修饰符 就是这样一个场景 父组件直接修改状态A当然没问题,但是子组件不能直接修改状态A,因为单向数据流限制 单向数据流 uni-app官网 所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会…

AFP vs SMB vs NFS: 谁是最好的数据传输协议?

目录 SMB: 什么是SMB 协议? NFS: 什么是NFS协议? AFP: 设么是AFP协议? 如何选择合适的传输协议? 场景1: 大型企业 场景2: 小型网站设计公司 场景3: Linux软件开发组 可以在互联网上使用这些协议吗? AFP vs SMB vs NFS …

Docker的安装和镜像容器的基本操作

Docker的安装和镜像容器的基本操作 Docker 概述Docker与虚拟机的区别namespace的六项隔离Docker核心概念 安装 DockerDocker 镜像操作搜索镜像获取镜像镜像加速下载查看镜像信息查看下载的镜像文件信息查看下载到本地的所有镜像根据镜像的唯一标识 ID 号,获取镜像详…

基于struts + spring + hibernate的题库与试卷管理系统源码

3需求分析和设计方案 3.1 题库管理 3.1.1 试题管理需求分析 试题管理是整个系统非常核心的模块,它基于知识点模块、章节模块、课程模块、题型管理模块完成的基础上的。其中核心元素是试题,通过试题将题库中的各模块连接起来。 试题管理分为题库录入和…

MyBatisPlus学习

官网:https://mp.baomidou.com/ MyBatis Plus,简化 MyBatis ! 1.概述 需要的基础:把我的MyBatis、Spring、SpringMVC就可以学习这个了! 为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间&#xff0…

随机模型预测控制(SMPC)——考虑概率约束(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 模型预测控制(MPC)又称为滚动时域控制和滚动时域控制,是一种强有力的工程应用技术。MPC的价…

springboot +flowable,处理 flowable 的用户和用户组(一)

一.简介 对于flowable是什么以及关于此框架的具体信息可以参看此项目的官方文档:https://www.flowable.org/docs/userguide/index.html Flowable is a light-weight business process engine written in Java.这是官网文档对此框架的完美解释:Flowable…

AIGC技术周报|清华、北邮新研究:让文生图AI更懂你

AIGC通过借鉴现有的、人类创造的内容来快速完成内容创作。ChatGPT、Bard等AI聊天机器人以及DallE 2、Stable Diffusion等文生图模型都属于AIGC的典型案例。「AIGC技术周报」将为你带来最新的paper、博客等前瞻性研究。 OpenAGI:当大模型遇见领域专家 “愿原力与大型…