2024-09-08
单片机
00

目录

使用PIC16F1719生成DAC梯形波形
硬件设置
连接示波器
配置PIC16F1719
初始化DAC
生成梯形波形
观察输出
小结
代码资源

使用PIC16F1719生成DAC梯形波形

在嵌入式系统中,数模转换器(DAC)是一种关键组件,可以将数字信号转换为模拟信号。本文将介绍如何使用PIC16F1719微控制器和XC8编译器来生成一个简单的梯形波形,该波形可以通过RA2引脚输出,并通过示波器进行监测。

硬件设置

本项目的硬件配置非常简单。我们使用的是Microchip的PIC16F1719微控制器,内部振荡器设置为32MHz。通过数模转换器(DAC1),我们将在RA2引脚生成一个梯形波形,并使用示波器来观察输出波形。

连接示波器

将示波器的探针连接到RA2引脚,该引脚将用于输出生成的波形。示波器可以直观地显示DAC生成的模拟信号,帮助我们分析波形的形状和频率。

配置PIC16F1719

在代码中,我们首先设置了PIC16F1719的配置位,包括振荡器、看门狗定时器(WDT)、低电压复位(BOR)等。关键的配置如下:

c
#pragma config FOSC = INTOSC // 使用内部振荡器 #pragma config WDTE = OFF // 禁用看门狗定时器 #pragma config BOREN = OFF // 禁用低电压复位 #pragma config PLLEN = ON // 使能4倍锁相环 (PLL)

这些配置确保微控制器使用32MHz的内部时钟,并禁用不需要的功能,如看门狗定时器和低电压复位,以减少不必要的干扰。

初始化DAC

接下来,我们配置DAC模块,使其能够在RA2引脚生成模拟信号。关键步骤如下:

  1. 使能DAC模块:

    c
    DAC1CON0bits.DAC1EN = 1; // 使能DAC
  2. 选择DAC输出引脚:

    c
    DAC1CON0bits.DAC1OE1 = 1; // 使能DAC输出引脚
  3. 设置DAC电压参考源:

    c
    DAC1CON0bits.DAC1PSS = 0; // 正电源为Vdd DAC1CON0bits.DAC1NSS = 0; // 负电源为Vss
  4. 初始化DAC输出:

    c
    DAC1CON1bits.DAC1R = 0; // 初始输出为0V

这些配置使得DAC模块能够将数字值转换为模拟信号,并通过RA2引脚输出。DAC的电压参考为Vdd和Vss,意味着DAC的输出范围在0V到Vdd之间。

生成梯形波形

为了生成一个简单的梯形波形,我们在主循环中不断递增DAC的输出值。这会使得输出的电压线性增加,形成一个梯形波形。

c
while (1) { DAC1CON1++; }

在每次循环中,DAC的输出寄存器DAC1R都会递增1,从而使得输出电压逐渐升高。由于DAC输出的分辨率为5位,因此电压将在线性变化的范围内逐步增大。

观察输出

在完成上述设置后,梯形波形将在RA2引脚上生成并输出。通过将示波器探头连接到该引脚,可以直观地观察到电压随着时间线性上升的波形。

小结

本项目展示了如何使用PIC16F1719微控制器的DAC模块生成一个简单的梯形波形。通过配置DAC的输出引脚和参考电压源,我们能够快速生成模拟信号,并通过示波器监测输出波形。这种技术在音频信号生成、传感器模拟以及其他需要数模转换的嵌入式应用中非常有用。

代码的简洁性和硬件的简单连接,使得这个项目成为学习和使用PIC DAC模块的一个很好的起点。

代码资源

c
/* PIC16F1719 配置位设置 */ #pragma config FOSC = INTOSC /* 振荡器选择位 (INTOSC 振荡器: CLKIN 引脚上的 I/O 功能) */ #pragma config WDTE = OFF /* 看门狗定时器使能 (WDT 禁用) */ #pragma config PWRTE = OFF /* 上电定时器使能 (PWRT 禁用) */ #pragma config MCLRE = ON /* MCLR 引脚功能选择 (MCLR/VPP 引脚功能为 MCLR) */ #pragma config CP = OFF /* 闪存程序存储器代码保护 (程序存储器代码保护禁用) */ #pragma config BOREN = OFF /* 低电压复位使能 (低电压复位禁用) */ #pragma config CLKOUTEN = OFF /* 时钟输出使能 (CLKOUT 功能禁用。CLKOUT 引脚上的 I/O 或振荡器功能) */ #pragma config IESO = ON /* 内外部切换模式 (内外部切换模式使能) */ #pragma config FCMEN = ON /* 故障安全时钟监控器使能 (故障安全时钟监控器使能) */ #pragma config WRT = OFF /* 闪存自写保护 (写保护关闭) */ #pragma config PPS1WAY = OFF /* 外设引脚选择单向控制 (PPSLOCK 位可以通过软件反复设置和清除) */ #pragma config ZCDDIS = ON /* 零交叉检测禁用 (ZCD 禁用。ZCD 可以通过设置 ZCDCON 的 ZCDSEN 位来启用) */ #pragma config PLLEN = ON /* 锁相环使能 (4x PLL 使能) */ #pragma config STVREN = ON /* 栈溢出/下溢复位使能 (栈溢出或下溢将导致复位) */ #pragma config BORV = LO /* 低电压复位电压选择 (低电压复位电压 (Vbor),选择低触发点。) */ #pragma config LPBOR = OFF /* 低功率低电压复位 (低功率低电压复位禁用) */ #pragma config LVP = ON /* 低电压编程使能 (低电压编程使能) */ /* 定义系统振荡器频率 */ #define _XTAL_FREQ (32000000ul) #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> //counter variable int count = 0; void main(void) { unsigned char index = 0; /* 程序初始化设置 */ OSCCON = 0xF0; /* 设置 INTOSC 为 8MHz,并使用 4xPLL,使系统振荡器达到 32MHz */ INTCON = 0; /* 禁用所有中断源 */ PIE1 = 0; PIE2 = 0; PIE3 = 0; // Allow PLL startup time ~2 ms __delay_ms(10); ANSELA = 0x00; // 将所有A端口引脚设置为数字模式 ANSELB = 0x00; // 将所有B端口引脚设置为数字模式 ANSELC = 0x00; // 将所有C端口引脚设置为数字模式 // Set PIN D1 as output TRISDbits.TRISD1 = 0; TRISDbits.TRISD2 = 0; // Turn off LED LATDbits.LATD1 = 0; LATDbits.LATD1 = 0; ////////////////////// // Configure DAC ///////////////////// // DAC enabled DAC1CON0bits.DAC1EN = 1; // DACOUT pin enabled DAC1CON0bits.DAC1OE1 = 1; // +ve source is Vdd DAC1CON0bits.DAC1PSS = 0; // -ve source is Vss DAC1CON0bits.DAC1NSS = 0; // Initial output is 0v DAC1CON1bits.DAC1R = 0; INTCONbits.PEIE = 1; // 使能外设中断 INTCONbits.GIE = 1; // 使能全局中断 while (1) { DAC1CON1++; } }

image.png

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!