在嵌入式系统中,数模转换器(DAC)是一种关键组件,可以将数字信号转换为模拟信号。本文将介绍如何使用PIC16F1719微控制器和XC8编译器来生成一个简单的梯形波形,该波形可以通过RA2引脚输出,并通过示波器进行监测。
本项目的硬件配置非常简单。我们使用的是Microchip的PIC16F1719微控制器,内部振荡器设置为32MHz。通过数模转换器(DAC1),我们将在RA2引脚生成一个梯形波形,并使用示波器来观察输出波形。
将示波器的探针连接到RA2引脚,该引脚将用于输出生成的波形。示波器可以直观地显示DAC生成的模拟信号,帮助我们分析波形的形状和频率。
在代码中,我们首先设置了PIC16F1719的配置位,包括振荡器、看门狗定时器(WDT)、低电压复位(BOR)等。关键的配置如下:
c#pragma config FOSC = INTOSC // 使用内部振荡器
#pragma config WDTE = OFF // 禁用看门狗定时器
#pragma config BOREN = OFF // 禁用低电压复位
#pragma config PLLEN = ON // 使能4倍锁相环 (PLL)
这些配置确保微控制器使用32MHz的内部时钟,并禁用不需要的功能,如看门狗定时器和低电压复位,以减少不必要的干扰。
接下来,我们配置DAC模块,使其能够在RA2引脚生成模拟信号。关键步骤如下:
使能DAC模块:
cDAC1CON0bits.DAC1EN = 1; // 使能DAC
选择DAC输出引脚:
cDAC1CON0bits.DAC1OE1 = 1; // 使能DAC输出引脚
设置DAC电压参考源:
cDAC1CON0bits.DAC1PSS = 0; // 正电源为Vdd
DAC1CON0bits.DAC1NSS = 0; // 负电源为Vss
初始化DAC输出:
cDAC1CON1bits.DAC1R = 0; // 初始输出为0V
这些配置使得DAC模块能够将数字值转换为模拟信号,并通过RA2引脚输出。DAC的电压参考为Vdd和Vss,意味着DAC的输出范围在0V到Vdd之间。
为了生成一个简单的梯形波形,我们在主循环中不断递增DAC的输出值。这会使得输出的电压线性增加,形成一个梯形波形。
cwhile (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++;
}
}
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!