打印
[PIC®/AVR®/dsPIC®产品]

PIC16系列数模转换器(DAC)

[复制链接]
704|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2025-1-21 14:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
引言
数模转换器(Digital-to-Analog Converter, DAC)是将数字信号转换为模拟信号的电路。在嵌入式系统中,DAC 用于生成连续的电压信号,这些信号可以用于控制电机、显示亮度、音频输出等各种应用。PIC16 系列单片机中集成了 DAC 模块,使得开发者可以方便地实现这些功能。本节将详细介绍 PIC16 系列单片机中 DAC 模块的原理和应用,并提供具体的代码示例。



DAC 模块概述
模块功能
PIC16 系列单片机中的 DAC 模块可以将数字输入值转换为相应的模拟电压输出。常见的 DAC 输出范围是 0V 到 Vref(参考电压),数字输入值通常为 8 位或 10 位。DAC 模块可以通过编程控制输出电压的精度和范围。

模块配置
DAC 模块的配置通常涉及以下几个步骤:

选择参考电压:参考电压决定了 DAC 输出电压的范围。常见的参考电压选项包括 Vdd、Vss 和外部参考电压。

选择输出通道:根据应用需求选择合适的 DAC 输出通道。

设置分辨率:配置 DAC 的分辨率,常见的分辨率有 8 位和 10 位。

启动 DAC:使能 DAC 模块,开始输出模拟电压。

DAC 模块的硬件接口
引脚配置
在 PIC16 系列单片机中,DAC 模块通常连接到特定的引脚。例如,PIC16F1825 的 DAC 模块可以连接到 AN12 引脚。配置引脚时,需要将引脚设置为 DAC 模式。

参考电压选择
参考电压的选择通常通过配置寄存器来实现。例如,PIC16F1825 的 DAC 模块可以通过配置 DACCON0 寄存器的 VREFSEN 位来选择参考电压源。常见的选择包括:

Vdd:使用电源电压 Vdd 作为参考电压。

Vss:使用地电压 Vss 作为参考电压。

外部参考电压:使用外部提供的参考电压。

DAC 模块的软件配置
配置寄存器
DAC 模块的配置主要通过几个寄存器来实现。以下是 PIC16F1825 中 DAC 模块的主要寄存器:

DACCON0:控制 DAC 的使能和参考电压源。

DACCON1:设置 DAC 的分辨率和输出值。

DACCON0 寄存器
DACAEN:使能 DAC 模块。

VREFSEN:选择参考电压源。

DACAIF:选择 DAC 输入格式。

DACCON1 寄存器
DACOUT:设置 DAC 输出值。

DACRSEN:选择 DAC 分辨率。

配置示例
下面是一个配置 PIC16F1825 DAC 模块的示例代码,使用 Vdd 作为参考电压,设置 8 位分辨率,并输出 1.25V 的电压。


#include <xc.h>

#include <pic16f1825.h>



// 配置 DAC

void configure_DAC() {

    // 使能 DAC 模块

    DACCON0 = 0b00000001; // DACAEN = 1, VREFSEN = 0, DACAIF = 0



    // 设置 8 位分辨率

    DACCON1 = 0b00000000; // DACRSEN = 0



    // 设置 DAC 输出值

    set_DAC_output(50); // 50/255 * Vdd = 1.25V (假设 Vdd = 5V)

}



// 设置 DAC 输出值

void set_DAC_output(uint8_t value) {

    DACCON1 = (DACCON1 & 0b11110000) | value; // 保留分辨率位,设置输出值

}



void main(void) {

    // 配置系统时钟

    OSCCON = 0b01100000; // 内部 8MHz 时钟



    // 配置 DAC

    configure_DAC();



    // 主循环

    while (1) {

        // 保持 DAC 输出

    }

}




代码说明
配置 DAC 模块:

DACAEN 位设置为 1,使能 DAC 模块。

VREFSEN 位设置为 0,选择 Vdd 作为参考电压源。

DACAIF 位设置为 0,选择直接数字输入格式。

设置 DAC 分辨率:

DACRSEN 位设置为 0,选择 8 位分辨率。
设置 DAC 输出值:

set_DAC_output 函数通过修改 DACCON1 寄存器的低 8 位来设置 DAC 输出值。假设 Vdd 为 5V,输出值为 50,则输出电压为 50 255 × 5 V = 1.25 V \frac{50}{255} \times 5V = 1.25V
255
50

×5V=1.25V。
DAC 模块的应用实例
生成可调电压
应用场景
在一个温度控制应用中,需要生成一个可调电压来控制加热器的功率。假设温度传感器返回的数值范围为 0-100,对应 0-5V 的电压输出。

代码示例

#include <xc.h>

#include <pic16f1825.h>



// 配置 DAC

void configure_DAC() {

    // 使能 DAC 模块

    DACCON0 = 0b00000001; // DACAEN = 1, VREFSEN = 0, DACAIF = 0



    // 设置 8 位分辨率

    DACCON1 = 0b00000000; // DACRSEN = 0

}



// 根据温度设置 DAC 输出值

void set_DAC_output_by_temperature(uint8_t temperature) {

    uint8_t value = (temperature * 255) / 100; // 将温度值映射到 0-255 的范围内

    DACCON1 = (DACCON1 & 0b11110000) | value; // 设置 DAC 输出值

}



void main(void) {

    // 配置系统时钟

    OSCCON = 0b01100000; // 内部 8MHz 时钟



    // 配置 DAC

    configure_DAC();



    // 主循环

    while (1) {

        uint8_t temperature = read_temperature(); // 读取温度传感器值

        set_DAC_output_by_temperature(temperature); // 根据温度设置 DAC 输出值



        // 延时

        __delay_ms(1000);

    }

}




代码说明
配置 DAC 模块:

DACAEN 位设置为 1,使能 DAC 模块。

VREFSEN 位设置为 0,选择 Vdd 作为参考电压源。

DACAIF 位设置为 0,选择直接数字输入格式。

根据温度设置 DAC 输出值:

set_DAC_output_by_temperature 函数将温度值映射到 0-255 的范围内,然后通过修改 DACCON1 寄存器的低 8 位来设置 DAC 输出值。
主循环:

在主循环中,读取温度传感器的值,并根据温度值调整 DAC 输出电压。每秒更新一次 DAC 输出值。
音频信号生成
应用场景
在音频应用中,需要生成一个正弦波信号来驱动扬声器。假设使用 10 位分辨率的 DAC,生成 1KHz 的正弦波信号。

代码示例

#include <xc.h>

#include <pic16f1825.h>

#include <math.h>

#include <stdint.h>



#define PI 3.14159265358979323846

#define SAMPLE_RATE 10000 // 采样率

#define FREQUENCY 1000 // 信号频率

#define VREF 5.0 // 参考电压 5V



// 配置 DAC

void configure_DAC() {

    // 使能 DAC 模块

    DACCON0 = 0b00000001; // DACAEN = 1, VREFSEN = 0, DACAIF = 0



    // 设置 10 位分辨率

    DACCON1 = 0b00010000; // DACRSEN = 1

}



// 设置 DAC 输出值

void set_DAC_output(uint16_t value) {

    DACCON1 = (DACCON1 & 0b11100000) | (value & 0b00001111); // 设置低 4 位

    DACCON2 = (value >> 4) & 0b00001111; // 设置高 4 位

}



void generate_sine_wave() {

    uint16_t value;

    uint16_t time = 0;

    uint16_t period = SAMPLE_RATE / FREQUENCY; // 计算一个周期的采样点数



    while (1) {

        value = (uint16_t)(0.5 * 1023 * (sin(2 * PI * time / period) + 1)); // 生成 10 位正弦波值

        set_DAC_output(value); // 设置 DAC 输出值

        time = (time + 1) % period; // 更新时间

        __delay_us(100); // 延时 100 微秒

    }

}



void main(void) {

    // 配置系统时钟

    OSCCON = 0b01100000; // 内部 8MHz 时钟



    // 配置 DAC

    configure_DAC();



    // 生成正弦波

    generate_sine_wave();

}




代码说明
配置 DAC 模块:

DACAEN 位设置为 1,使能 DAC 模块。

VREFSEN 位设置为 0,选择 Vdd 作为参考电压源。

DACAIF 位设置为 0,选择直接数字输入格式。

DACRSEN 位设置为 1,选择 10 位分辨率。

设置 DAC 输出值:

set_DAC_output 函数通过修改 DACCON1 和 DACCON2 寄存器来设置 10 位分辨率的 DAC 输出值。DACCON1 设置低 4 位,DACCON2 设置高 4 位。
生成正弦波:

generate_sine_wave 函数使用正弦函数生成 1KHz 的正弦波信号。time 变量用于跟踪当前时间点,period 变量用于计算一个周期的采样点数。每 100 微秒更新一次 DAC 输出值。
DAC 模块的注意事项
电源稳定性
DAC 模块的输出电压受电源电压的影响。因此,确保电源电压的稳定性和精度对于 DAC 输出的准确性至关重要。使用稳压电源或滤波电路可以提高电源的稳定性。

滤波器
DAC 输出的模拟信号可能包含高频噪声,特别是当 DAC 以较高的采样率工作时。在 DAC 输出端加一个低通滤波器可以滤除这些高频噪声,提高信号的质量。

分辨率和精度
DAC 的分辨率决定了输出电压的精度。10 位 DAC 的分辨率比 8 位 DAC 高,但需要更多的计算资源和内存。根据应用需求选择合适的分辨率。

延迟和定时
在生成波形或动态调整 DAC 输出值时,需要精确控制延迟和定时。使用定时器或延迟函数可以实现这一点。确保延时函数的精度,以避免信号失真。

结语
通过本节的学习,您应该已经了解了 PIC16 系列单片机中 DAC 模块的基本原理和配置方法。此外,我们还提供了生成可调电压和音频信号生成的两个应用实例。希望这些内容能帮助您更好地理解和应用 DAC 模块。在实际开发中,注意电源稳定性、滤波器使用和分辨率选择,以确保 DAC 输出的准确性和稳定性。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2401_87715305/article/details/145273598

使用特权

评论回复
沙发
yiy| | 2025-1-21 14:39 | 只看该作者
图片是AVR啊的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2086

主题

16137

帖子

15

粉丝