PIC12F1501使用DAC将模拟值写入引脚

时间:2018-07-22 08:04:56

标签: pic microchip

我对编程或C语言并不陌生,但是我对芯片编程尤其陌生,并且在查找和解密文档方面遇到很多麻烦。

具体来说,我将MPLab X IDE与XC8编译器结合使用。我的芯片是PIC12F1501。我的目的(暂时)是使LED缓慢地发出脉冲,但最终它会被适配为以正弦波驱动扬声器。可以肯定,我的电路是好的,因为我可以使LED闪烁并通过数字输出闪烁。

现在,我了解了如何设置TRIS寄存器,以便根据需要输出或输入右脚。我知道如何使用ANSEL将这些引脚设置为模拟模式。我似乎无法理解的是我需要使用什么命令或命令组合将模拟值实际写入引脚。我已经使用锁存器(LAT)设置了数字输出,但看不到如何对模拟值进行相同的操作。

从芯片的数据表中,我得到了一个模糊的想法,即我应该设置代表DAC的其他寄存器的值以确定电压输出的电平,然后将其锁存为1,就像数字输出一样。输出,但是我不习惯阅读这些东西。我已经尝试了DAC文档中提示的许多寄存器名称,但是没有一个可以编译。

我已经尝试了相同近似家族中其他芯片的代码片段,但是它们都不可以编译。

有人可以分享一个简短的代码片段,演示PIC12F1501中模拟输出的工作原理吗?

3 个答案:

答案 0 :(得分:0)

在PIC12(L)F1501的规格表中,您将找到第16章(第124-126页)中所述的所需寄存器。简而言之,它们是DAC1CON0和DAC1CON1。您可以通过DAC1CON1寄存器设置所需的值,并通过DAC1CON0寄存器启用/配置。

要注意的一件事是,DAC并非旨在驱动外部负载,除非您具有外部缓冲器,否则DAC可能无法与连接的LED一起工作。

// With 5V and 0V Positive/Negative references, outputs 3.125V 
// (See manual equation 16-1).
DAC1CON1 = 20;

// Enable the DAC and output to both DACOUT pins using VDD as positive
// reference (see manual register 16-1).
DAC1CON0 = 0b10110000;

// Note that most chips also have utility structs in the MC8 headers so 
// you can also set the bits individually as follows:
DAC1CON0bits.DACOE1 = 1;
DAC1CON0bits.DACOE2 = 1;
DAC1CON0bits.DACEN = 1;

答案 1 :(得分:0)

Microchip提供的头文件仅定义DACCON0和DACCON1而不定义DAC1CON0或DAC1CON1。

此代码可能会为您构建:

/*
 * File:        main.c
 * Target:      PIC12F1501
 * Compiler:    XC8 v1.45
 * IDE:         MPLABX v4.05
 * Author:      dan1138
 *
 *
 *                          PIC12F1501
 *              +---------------:_:---------------+
 *       PWR -> : 1 VDD                     VSS 8 : <- GND
 *           <> : 2 RA5         DACOUT1/PGD/RA0 7 : <> ICD_PGD 
 *           <> : 3 RA4                 PGC/RA1 6 : <> ICD_PGC
 *  ICD_MCLR -> : 4 RA3/MCLR    DACOUT2/INT/RA2 5 : <> DAC-OUTPUT
 *              +---------------------------------+
 *                             DIP-8
 *
* Created on July 25, 2018, 7:20 PM
 */
#pragma config FOSC = INTOSC    /* Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin) */
#pragma config WDTE = OFF       /* Watchdog Timer Enable (WDT disabled) */
#pragma config PWRTE = OFF      /* Power-up Timer Enable (PWRT disabled) */
#pragma config MCLRE = ON       /* MCLR Pin Function Select (MCLR/VPP pin function is MCLR) */
#pragma config CP = OFF         /* Flash Program Memory Code Protection (Program memory code protection is disabled) */
#pragma config BOREN = OFF      /* Brown-out Reset Enable (Brown-out Reset disabled) */
#pragma config CLKOUTEN = OFF   /* Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) */
#pragma config WRT = OFF        /* Flash Memory Self-Write Protection (Write protection off) */
#pragma config STVREN = ON      /* Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) */
#pragma config BORV = LO        /* Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) */
#pragma config LPBOR = OFF      /* Low-Power Brown Out Reset (Low-Power BOR is disabled) */
#pragma config LVP = OFF        /* Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) */

#include <xc.h>

void main(void) 
{
    DACCON0 = 0x90;     /* DAC drives DACOUT2 */
    for(;;)
    {
        /* generate a 5-bit sawtooth outout */
        DACCON1 = (DACCON1 + 1u) & 0x1Fu;
    }
}

答案 2 :(得分:0)

您的PIC12F1501还具有4个PWM通道。将RC滤波器置于引脚后面时,可以非常轻松地将这些PWM用作模拟输出。那将为您提供高达10位的分辨率。