【STC8A8K64D4开发板】第2-17讲:PCA实现数模转换(DAC)

第2-17讲:PCA实现数模转换(DAC)

    1. 学习目的
  1. 了解DAC数模转换原理及RC积分电路原理。
  2. 掌握STC8A8K64D4系列单片机实现DAC功能的硬件和软件设计。
    1. DAC简介

DAC (全称是Digital to Analog Convertor)数模转换器是一种将数字信号转换为模拟信号(以电流、电压或)的设备或电路。在很多数字系统中(例如计算机、单片机),信号以数字方式(0或者1)存储和传输,而数模转换器DAC可以将这样的信号转换为模拟信号,从而使得他们能够被外界(人或其他非数字系统)识别。数模转换器DAC的常见用法是在音乐播放器中将数字形式存储的音频信号输出为模拟的声音。

T型电阻网络方式是一种常见的DAC实现方法,由T型电阻网络和运算放大器组成,下图是8位DAC的原理示意图。输入数字量中的每位都按其权值分别转换为模拟量,之后通过运算放大器求和相加。

图1:T型电阻网络示意图

上图中,由于运算放大器的反相输入端为“虚地”,所以无论模拟开关连接到“0”还是 “1”,从T形电阻网络节点对“地”往右看的等效电阻均为R,由此可计算出基准电流I=VREF/R。再根据电流可计算出流过各个分支的电流从右向左(I0~I7)依次是I/2、I/4、I/8、I/16、I/32、I/64、I/128和、I/256。

由此,每一位数字量都发挥了有效的位权,流向运算放大器反相输入端的总电流如下: 

该电流经过运算放大器换成模拟电压输出,从而实现由数字信号到模拟信号的转换。这里以8位DAC示例,输出电压有256种变化,当然,这种T形电阻网络的转换原理可以推广到n位,实现n位DAC。

市面上很多单片机片内集成了DAC外设,并且也有专用独立DAC芯片供用户选择使用,那为什么还需要使用PWM实现DAC?

这是因为虽然市面上很多集成了DAC的单片机和独立DAC芯片,他们使用起来更方便,并且精度也高,但是很多时候,我们并不需要很高的精度,我们选择使用的单片机可能没有DAC外设,但是一般都有PWM,因此,出于对成本的考虑,我们会使用PWM实现DAC,从而节省成本。

    1. 硬件电路设计

STC8A8K64D4系列单片机片内没有集成DAC外设,因此,IK-64D4开发板通过PCA工作于PWM模式输出高速PWM脉冲配合RC滤波电路实现DAC功能。

实现DAC转换是基于将高速PWM信号通过RC电路整合成比较平缓的电压信号作为模拟输出,通过改变高速PWM信号的占空比达到改变输出电平信号幅度的目的。为了达到比较理想的电压信号输出,P7.0口输出的PWM信号经二阶RC滤波电路整合,如下图所示。

图2:PWM实现DAC电路

  • 注:开发板J27端子需使用短路帽短接P06和DAC_O以及P70和DAC_I,并且将J27端子的P06和ADC以及P70和DHT11的短路帽去掉。

    1. 软件设计
      1. PWM实现DAC实验
  • 注:本节的实验是在“实验2-11-1:ADC采样电位器电压(查询方式)”的基础上修改,本节对应的实验源码是:“实验2-17-1: PWM实现DAC实验”。
  • 关于PWM的内容,读者可以参阅《第2-16讲:可编程计数器阵列PCA》中的PCA实现PWM部分的内容。
        1. 实验内容

配置PCA模块0工作于PWM模式, PCA配置如下:

  1. 系统时钟:24MHz。
  2. PCA时钟源:系统时钟= 24Mhz。
  3. 功能引脚:P7.0。
  4. 中断:不开启中断。
  5. PWM位数:8位。

程序运行后,在主循环中不断改变PWM的占空比,从而改变P7.0输出的电压值。实验中为了方便观察实验现象,配置P0.6为ADC功能引脚,并通过跳线帽将其连接到DAC电路的输出端,这样,就可以实时获取DAC输出的电压值并通过串口输出,以便于我们观察实验现象(DAC输出电压值的改变)。

        1. 代码编写
  1. 新建一个名称为“pca.c”的文件及其头文件“pca.h”并保存到工程的“Source”文件夹,并将“pca.c”加入到Keil工程中的“SOURCE”组。
  2. 引用头文件

因为在“pca.c”文件中使用了“pca.c”文件中的函数,所以需要引用下面的头文件“pca.h”。

代码清单:引用头文件

  1. //引用pca的头文件  
  2. #include   " pca.h"  
  1. PCA初始化

本例中,我们配置PCA模块0工作于PWM模式,PCA时钟源使用系统时钟(24Mhz),功能引脚为P7.0,代码清单如下。

代码清单:PCA初始化

  1.  /*************************************************************************** 
  2.  * 描  述 : PCA初始化 
  3.  * 入  参 : 无 
  4.  * 返回值 : 无 
  5.  **************************************************************************/  
  6. void pca_init(void)  
  7. {  
  8.    CCON = 0x00;        //CF、CR、CCF1、CCF0位均清零  
  9.        
  10.    P_SW1 &= 0xEF;      //PCA模块0功能引脚选择P7.0              
  11.    P_SW1 |= 0x20;                    
  12.    /*--------------------PCA模式寄存器CMOD配置--------------------------- 
  13.      位7  位6  位5  位4   位3~位1    位0 
  14.      CIDL   x    x    x    CPS[2~0]    BCF 
  15.       0     x    x    x      100       0 
  16.      
  17.     CIDL=0:空闲模式下仍然计数 
  18.     CPS[2~0]=100:PCA时钟源选择:系统时钟 
  19.     BCF=0:禁止PCA计数器溢出中断 
  20.    -----------------------------END------------------------------------*/  
  21.    CMOD = 0x08;   
  22.    CL = 0x00;          //PCA计数器赋初值  
  23.    CH = 0x00;          //PCA计数器赋初值  
  24.       
  25.    IP &= ~0x02;        //中断优先级配置为2(较高优先级)    
  26.    IPH |= 0x02;  
  27.     /*------------------PCA模块0模式控制寄存器CCAPM0配置------------------ 
  28.     位7   位6    位5    位4     位3    位2   位1    位0 
  29.      x   ECOM0  CCAPP0  CCAPN0   MAT0   TOG0  PWM0   ECCF0 
  30.      x     0      0       0       0      0     1       0  
  31.      
  32.     ECOM0=0:关闭PCA模块0的比较功能 
  33.     CCAPP0=0:关闭PCA模块0的上升沿捕获 
  34.     CCAPN0=0:关闭PCA模块0的下降沿捕获 
  35.     MAT0=0:关闭PCA模块0的匹配功能 
  36.     TOG0=0:关闭PCA模块0的高速脉冲输出功能 
  37.     PWM0=1:开启PCA模块0的脉宽调制输出功能 
  38.     ECCF0=0:禁止PCA模块0的匹配/捕获中断 
  39.    -----------------------------END------------------------------------*/
  40.    CCAPM0 = 0x02;
  41.       
  42.    PCA_PWM0 &= 0x3F;               //PCA模块0工作于8位PWM功能  
  43.    PCA_PWM0 &= 0xFC;               //EPC0H位和EPC0L位置0  
  44.    CCAP0L = 0x00;            //PCA比较值寄存器赋初值        
  45.    CCAP0H = 0x00;            //PCA比较值寄存器赋初值   
  46.    CR = 1;                   //启动PCA计数器阵列计数    
  47. }  
  1. 主函数

主函数中初始化PCA和ADC,PCA计数启动后,在主循环中不断改变PWM的占空比,使得DAC输出不同的电压。

ADC采样DAC输出的电压值后,通过串口输出采样值及其对应的电压值,代码清单如下。

代码清单:主函数

  1. /*************************************************************************** 
  2.  * 描  述 : 主函数 
  3.  * 入  参 : 无 
  4.  * 返回值 : 无 
  5.  **************************************************************************/  
  6. int main(void)  
  7. {  
  8.    u16 adc_value;  //存放ADC采样值  
  9.    float voltage;  //存放ADC采样值计算后的电压值  
  10.    u16 TempData;  
  11.       
  12.    P2M1 &= 0xBF;   P2M0 &= 0xBF;     //设置P2.6为准双向口(LED1)  
  13.    P3M1 &= 0xFE;   P3M0 &= 0xFE;     //设置P3.0为准双向口(串口1的RxD)  
  14.    P3M1 &= 0xFD;   P3M0 |= 0x02;     //设置P3.1为推挽输出(串口1的TxD)  
  15.    P7M1 &= 0xFE;   P7M0 |= 0x01;     //设置P7.0为推挽输出  
  16.       
  17.    pca_init();  
  18.    uart1_init();                 //串口1初始化  
  19.    adc_config();                 //初始化ADC    
  20.    EA = 1;                       //使能总中断  
  21.       
  22.    while(1)  
  23.    {  
  24.       TempData++;  
  25.       CCAP0H = (u8)(256 - TempData);      //P7.0引脚输出频率不变但占空比不断变化的脉冲信号  
  26.       if(TempData>138)TempData=1;          //占空比达到很大时重新设定占空比
  27.       delay_ms(5);   
  28.       adc_value = get_adc_value();                  //读取ADC采样值  
  29.       voltage   = (2.5*adc_value)/4096;               //将ADC采样值转换为电压(单位V)  
  30.       printf("ADC采样值: %d\r\n",adc_value);       //串口打印上传的采集的原始值  
  31.       printf("采样值对应的电压:%.2fV\r\n",voltage);//串口打印ADC采样电压  
  32.       delay_ms(200);                                //延时200ms,方便观察数据  
  33.       led_toggle(LED_1);  //翻转指示灯D1状态,指示一次ADC采样完成  
  34.    }  
  35. }  
        1. 硬件连接

本实验通过P7.0输出PWM信号实现DAC输出,P0.6配置为ADC用于采样DAC电路输出的电压,按照下图所示连接跳线帽。

图3:硬件连接

        1. 实验步骤
  1. 解压“…\第3部分:配套例程源码”目录下的压缩文件“实验2-17-1: PWM实现DAC实验”,将解压后得到的文件夹拷贝到合适的目录,如“D\STC8”(这样做的目的是为了防止中文路径或者工程存放的路径过深导致打开工程出现问题)。
  2. 双击“…\pca_dac\project”目录下的工程文件“pca_dac.uvproj”。
  3. 点击编译按钮编译工程,编译成功后生成的HEX文件“pca_dac.hex”位于工程的“…\pca_dac\Project\Object”目录下。
  4. 打开STC-ISP软件下载程序,下载使用内部IRC时钟,IRC频率选择:24MHz。
  5. 电脑上打开串口调试助手,选择开发板对应的串口号,将波特率设置为9600bps。程序运行后,在串口接收窗口可以看到开发板上报的ADC采样值及其对应的电压值,如下图所示。

图4:串口调试助手中观察电压值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java多线程实战-CompletableFuture异步编程优化查询接口响应速度

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️本系列源码仓库:多线程并发编程学习的多个代码片段(github) 🏷️个人学习笔记,若有缺误,欢迎评论区指正…

现代卷积神经网络

深度卷积神经网络(AlexNet) 经典机器学习的流水线: ①获取一个有趣的数据集; ②根据光学、几何学,手动对特征数据集进行预处理; ③通过标准的特征提取算法,如SIFT(尺度不变特征变…

BT 宝塔面板 宝塔面板可以登录, 但是使用里边功能的时候就被拒绝链接

目录 问题 面板可以登录 功能请求被拒绝尝试重启面板 也不行解决方案 更新BT版本 问题 面板可以登录 功能请求被拒绝 面板可以登录 但是 使用里边功能的时候 就会被拒绝 尝试重启面板 也不行 气的我都想重装了 但是我又懒得配置 我怀疑是请求头的问题 解决方案 更新BT版本 …

【力扣hot100】128.最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums [100,4,200,1,3,2] 输出:4 解…

【运维】MacOS Wifi热点设置

目录 打开热点 配置共享网段 打开热点 打开macOS设置,进入通用->共享 点击如下图标进行配置, 会进入如下界面(⚠️目前是打开共享状态,无法修改配置,只有在未打开状态才能进入配置) 配置完成后&#x…

WebClient上载文件——实现将本地文件同步到远端服务器上

问题描述 用户上传产品示例图片到服务器端上,客户端在请求图片资源时,当服务端架设了多个节点的情况下,由于没有负载均衡请求到保存图片资源的服务器,出现图片访问404的问题。 这里保存上传文件时,同时需要将该文件保…

PTA题解 --- 阶梯电价(C语言)

今天是PTA题库解法讲解的第五天,今天我们要讲解A-B,题目如下: 解题思路: 要解决这个问题,我们可以编写一个C语言程序,首先判断输入的月用电量是否有效(即大于等于0)。如果有效&…

java设计模式(1)---总则

设计模式总则 一、概述 1、什么是设计模式 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 解释下: 分类编目:就是说可以找到一些特征去划分这些设计模式,从而进行分类。 代码设计经验:这句很重…

大屏可视化综合展示解决方案

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.…

HAL STM32G4 +TIM1 3路PWM互补输出+VOFA波形演示

HAL STM32G4 TIM1 3路PWM互补输出VOFA波形演示 ✨最近学习研究无刷电机驱动,虽然之前有使用过,但是在STM32上还没实现过。本文内容参考欧拉电子例程,从PWM驱动开始学习。 欧拉电子相关视频讲解: STM32G4 FOC开发实战—高级定时器发…

一步到位:用Python实现PC屏幕截图并自动发送邮件,实现屏幕监控

在当前的数字化世界中,自动化已经成为我们日常生活和工作中的关键部分。它不仅提高了效率,还节省了大量的时间和精力。在这篇文章中,我们将探讨如何使用Python来实现一个特定的自动化任务 - PC屏幕截图自动发送到指定的邮箱。 这个任务可能看…

抢滩中东商机!2024年现在入局是否还为时不晚?

有人说,在2024年,做外贸工厂跨境电商的老板,想要翻身,甚至想改变命运,有两个路径,其中一个路径就是:做沙特电商。 入局中东电商好时机 经商环境好:欧美市场竞争激烈,进入…

第十四届蓝桥杯大赛软件赛省赛Java大学B组

最近正在备考蓝桥杯,报的java b组,顺便更一下蓝桥的 幸运数字 题目 思路:填空题,暴力即可 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {static int trans(int x, int y){int …

【目标检测基础篇】目标检测评价指标:mAP计算的超详细举例分析以及coco数据集标准详解(AP/AP50/APsmall.....))

学习视频&#xff1a; 霹雳吧啦Wz-目标检测mAP计算以及coco评价标准 【目标检测】指标介绍&#xff1a;mAP 1 TP/FP/FN TP(True Positive) : IoU>0.5的检测框数量(同一Ground truth只计算一次)FP(False Positive) : IoU<0.5的检测框(或者是检测到同一个GT的多余检测框的…

nacos 更新报错“发布失败。请检查参数是否正确”

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容起因解决方案结果 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华…

FL Studio2024全能数字编曲音频工作站,打造专业电音的不二之选!

FL Studio2024全能数字编曲音频工作站&#xff0c;打造专业电音的不二之选&#xff01; 专业机构力荐&#xff0c;让你的音乐创作如虎添翼 在音乐的世界里&#xff0c;没有什么比创作出属于自己的独特旋律更令人兴奋的了。 而今天&#xff0c;我们为你带来了一款能够让音乐制作…

Hive SQL必刷练习题:排列组合问题【通过join不等式】

排列组合问题【通过join不等式】 这种问题&#xff0c;就是数学的排列不等式&#xff0c;一个队伍只能和其余队伍比一次&#xff0c;不能重复 方法1&#xff1a;可以直接通过join&#xff0c;最后on是一个不等式【排列组合问题的解决方式】 方法2&#xff1a;也可以是提前多加…

PDF文件如何以数字进行批量重命名?以数字重命名的PDF文件

在日常生活和工作中&#xff0c;我们经常需要处理大量的PDF文件&#xff0c;如文档、报告、合同等。为了更高效地管理这些文件&#xff0c;一个有效的方式就是对它们进行批量命名。批量命名不仅能提高文件的组织性&#xff0c;还能节省大量时间。下面&#xff0c;我们将详细介绍…

springboot实现文件上传

SpringBoot默认静态资源访问方式 首先想到的就是可以通过SpringBoot通常访问静态资源的方式&#xff0c;当访问&#xff1a;项目根路径 / 静态文件名时&#xff0c;SpringBoot会依次去类路径下的四个静态资源目录下查找&#xff08;默认配置&#xff09;。 在资源文件resour…

关于调度算法,小林给出更好的例子(银行办理业务)

看的迷迷糊糊&#xff1f;那我拿去银行办业务的例子&#xff0c;把上面的调度算法串起来&#xff0c;你还不懂&#xff0c;你锤我&#xff01; 办理业务的客户相当于进程&#xff0c;银行窗口工作人员相当于 CPU。 现在&#xff0c;假设这个银行只有一个窗口&#xff08;单核 …