00001 /************************************************************************************************** 00002 Title : PIC24F Series DAC Driver 00003 Programmer : Yosuke FURUSAWA 00004 Copyright : Copyright (C) 2010 Yosuke FURUSAWA. 00005 License : 4-clause BSD License 00006 Since : 2010/05/22 00007 00008 Filename : libdac.c 00009 Last up date : 2010/05/23 00010 Kanji-Code : Shift-JIS 00011 TAB Space : 4 00012 00013 Note : Single Channel Output 00014 **************************************************************************************************/ 00015 00016 00017 /*================================================================================================ 00018 ヘッダファイルをインクルード 00019 =================================================================================================*/ 00020 #include <p24FJ64GA002.h> 00021 00022 #include "types.h" 00023 00024 #include "librtc.h" 00025 #include "libdac.h" 00026 00027 00028 /*================================================================================================= 00029 マクロ定義 00030 =================================================================================================*/ 00031 00032 00033 /*================================================================================================= 00034 グローバル変数 00035 =================================================================================================*/ 00036 unsigned char dac = 0; 00037 00038 00039 /*================================================================================================= 00040 プロトタイプ宣言 00041 =================================================================================================*/ 00042 00043 00044 /************************************************************************************************** 00045 DAC 初期化 00046 **************************************************************************************************/ 00047 void DAC_init(void) 00048 { 00049 dac = 0; 00050 00051 #if defined(DAC_STANDARD) 00052 /* 内蔵 4bit DAC : 精度が悪くて、思ったよりも全然使い物にならない... */ 00053 CVRCON = 0b0000000011100000; 00054 00055 00056 #elif defined(DAC_PWM) 00057 /* PWMを想定して回路を設計していなかったので、出力が非線形すぎて使い物にならない (^^; */ 00058 OC5CON = 0b0000000000000110; 00059 RPOR7bits.RP14R = 22; 00060 00061 #elif defined(DAC_STDPWM) 00062 /* 内蔵 4bit DACを使って、PWM風に精度を拡張してみる... (^^;;; */ 00063 CVRCON = 0b0000000011100000; 00064 00065 /* Timer2に寄生する */ 00066 OC4R = 0x0001; 00067 OC4CON = 0b0000000000000001; 00068 IPC6bits.OC4IP = 5; 00069 IEC1bits.OC4IE = 1; 00070 IFS1bits.OC4IF = 0; 00071 00072 OC5R = PR2 >> 1; /* 50% Duty */ 00073 OC5CON = 0b0000000000000001; 00074 IPC10bits.OC5IP = 5; 00075 IEC2bits.OC5IE = 1; 00076 IFS2bits.OC5IF = 0; 00077 00078 #endif 00079 00080 DAC_setvalue(0x80); 00081 return; 00082 } 00083 00084 00085 /************************************************************************************************** 00086 DAC出力設定 00087 **************************************************************************************************/ 00088 void DAC_setvalue(unsigned char buf) 00089 { 00090 dac = buf; 00091 00092 #if defined(DAC_STANDARD) 00093 CVRCONbits.CVR = dac >> 4; 00094 00095 #elif defined(DAC_PWM) 00096 OC5RS = (long)((long)dac * (long)PR2) >> 8; 00097 00098 #elif defined(DAC_STDPWM) 00099 OC5R = (((dac & 0x0f) * PR2) >> 4) + 2; 00100 00101 #endif 00102 00103 return; 00104 } 00105 00106 00107 /************************************************************************************************** 00108 CVREFと OC4/5を使った PWMで精度を拡張 00109 **************************************************************************************************/ 00110 #if defined(DAC_STDPWM) 00111 00112 void __attribute__((interrupt, auto_psv)) _OC4Interrupt(void) 00113 { 00114 IFS1bits.OC4IF = 0; 00115 CVRCONbits.CVR = dac >> 4; 00116 OC4CON = 0b0000000000000001; 00117 return; 00118 } 00119 00120 void __attribute__((interrupt, auto_psv)) _OC5Interrupt(void) 00121 { 00122 IFS2bits.OC5IF = 0; 00123 CVRCONbits.CVR--; 00124 OC5CON = 0b0000000000000001; 00125 return; 00126 } 00127 00128 #endif 00129 00130