From 6b5a14b01f843fc905dee9f10ab14cd7242ddfdd Mon Sep 17 00:00:00 2001 From: jim Date: Fri, 7 Jan 2011 21:41:15 +0000 Subject: [PATCH] Changes to fix the real-10-bit case. git-svn-id: https://bucket.mit.edu/svn/nilm/zoom@9082 ddd99763-3ecb-0310-9145-efcb8ce7c51f --- firmware/dac.c | 25 +++++++++++++++++++------ firmware/dac.h | 31 +++++++++++++++++++++---------- firmware/mode_debug.c | 2 +- firmware/zoom.mcw | Bin 41472 -> 41472 bytes 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/firmware/dac.c b/firmware/dac.c index 5e7837f..4e35069 100644 --- a/firmware/dac.c +++ b/firmware/dac.c @@ -43,22 +43,35 @@ void dac_write(uint16_t val) { LATGbits.LATG9 = IO_LOW; if (IO_HIGH == 1) - SPI2BUF = __dac_actual(val); + SPI2BUF = __dac_to_spi_cmd(val); else - SPI2BUF = ~__dac_actual(val); + SPI2BUF = ~__dac_to_spi_cmd(val); while (!SPI2STATbits.SPIRBF) continue; (void) SPI2BUF; LATGbits.LATG9 = IO_HIGH; } -uint16_t dac_get_actual(uint16_t val) +/* Given a DAC command between DAC_LOW and DAC_HIGH, + get the actual expected output voltage as a 16-bit value, where: + 0xffff = 4.9998v + 0x8000 = 0v + 0x0000 = -5v +*/ +uint16_t dac_get_actual_16bit(uint16_t val) { - return __dac_actual(val); + return __dac_to_16bit_equiv(val); } -/* Get actual output voltage from DAC_LOW to DAC_HIGH, as a float */ +/* Given a DAC command between DAC_LOW and DAC_HIGH, + get the actual expected output voltage as a FLOAT, where: + DAC_HIGH = 4.9998v + DAC_MID = 0v + DAC_LOW = -5v + Example: for 10-bit DAC, convert integer command 123 into + the more accurate 123.45 using known lower bits. +*/ float dac_get_actual_float(uint16_t val) { - return __dac_actual(val) * (DAC_RANGE / 65536.0); + return __dac_to_16bit_equiv(val) * (DAC_RANGE / 65536.0); } diff --git a/firmware/dac.h b/firmware/dac.h index 8df6d58..92ef5f6 100644 --- a/firmware/dac.h +++ b/firmware/dac.h @@ -8,15 +8,18 @@ #if DAC_TYPE == 0 /* AD5542, normal 16-bit range */ #define DAC_BITS 16 - #define __dac_actual(x) (x) + #define __dac_to_spi_cmd(x) (x) + #define __dac_to_16bit_equiv(x) (x) #elif DAC_TYPE == 1 /* AD5542, fake 10-bit range using random lower bits */ #define DAC_BITS 10 - #define __dac_actual(x) (dac_lookup[(x)&1023]) + #define __dac_to_spi_cmd(x) (dac_lookup[(x)&1023]) + #define __dac_to_16bit_equiv(x) (dac_lookup[(x)&1023]) #elif DAC_TYPE == 2 /* MAX504, true 10-bit DAC */ #define DAC_BITS 10 - #define __dac_actual(x) ((x) << 2) + #define __dac_to_spi_cmd(x) ((x) << 2) + #define __dac_to_16bit_equiv(x) ((x) << 6) #else #error Unknown DAC type #endif @@ -36,14 +39,22 @@ void dac_init(void); */ void dac_write(uint16_t val); -/* From DAC value, get the expected actual output voltage: - 0xffff 4.9998v - 0x8000 0v - 0x0000 -5v +/* Given a DAC command between DAC_LOW and DAC_HIGH, + get the actual expected output voltage as a 16-bit value, where: + 0xffff = 4.9998v + 0x8000 = 0v + 0x0000 = -5v +*/ +uint16_t dac_get_actual_16bit(uint16_t val); + +/* Given a DAC command between DAC_LOW and DAC_HIGH, + get the actual expected output voltage as a FLOAT, where: + DAC_HIGH = 4.9998v + DAC_MID = 0v + DAC_LOW = -5v + Example: for 10-bit DAC, convert integer command 123 into + the more accurate 123.45 using known lower bits. */ -uint16_t dac_get_actual(uint16_t val); - -/* Get actual output voltage from DAC_LOW to DAC_HIGH, as a float */ float dac_get_actual_float(uint16_t val); #endif diff --git a/firmware/mode_debug.c b/firmware/mode_debug.c index 474b4a2..4e9dab5 100644 --- a/firmware/mode_debug.c +++ b/firmware/mode_debug.c @@ -58,7 +58,7 @@ void run_debug(void) dac_write(dac); uart1_put_hex16(dac); uart1_put(' '); - uart1_put_dec(dac_get_actual(dac)); + uart1_put_dec(dac_get_actual_16bit(dac)); uart1_put(' '); uart1_put(' '); adc = adc_get(); diff --git a/firmware/zoom.mcw b/firmware/zoom.mcw index 146cca8382a507010047cb7f9fc483d722bb297a..0a57b5060c8146e8ac4de498d48798f61bf91b1d 100644 GIT binary patch delta 2431 zcmeHHT}V@582-Mqlg`wphqiPmo>U};E?WjBBHR4IV#%lwEwvvvtaO`fGyECH`ICx> zIln+iBnvB3h`|iSZj8JT>LxPiMzI?S3C!As*wEfjr`C0Gu6*I}eCPdn-tYZ6$34rq zXBlq|8^SLy{+fU3v$MSte4b!wl_ctwgH%i3C}I-g&|ktLG|3QsSYq=egHUA9#se-j zC{Y-on`eyIF+!)|tOb0~s6=Ks*Q|0VfH4XH-e>cK^e&yS1)>5R?$rz6f}T0!T`J6O z^KL?H=64RYr`gds*gL>(Sm)4Jc?IQZ-X>iFGA%eoZS0VG!I6^EfTRw+Pz%BIl9cQ$ zywfC9M=yk+0GgoDX0z~V`~{;yr{~Y*<@0wl)#)10T+PiY%d=J1SQ&WtCHHGPU6YD329=YiE!V7+EC->j=rSC%7=CfSqW>N`wQY_1?( z+pnKY9PUYu0hf^<`^w#>1U|&OP;sKG&oGUMDLjK|Odt=#ix|Iwtc0s5C?c*{UPyUY zA4F4`LLOHpAA`z%a!3c~!caLX2c)*Ntv*)>AZ;&gGu2V?cE}M76W>@=nFGxv_Kih8!B|F)v&Uq$gY8)-56$77ReDDpG9!7*o+5tP zyfhTNX;BcJO#D&x!F?n4=)qXX@ES7ogUfq(^5LOb7qBmd%PBY#qzlp#d&$OLaOp*s zuA6VJwBe{cNJFD31-;(_CdJl-KP_Ki2`Kqf#@B6KmnkeZlX-Vq5nzIGtJP}KBBc6e z1s*H22jqyhtgR{DB>^nSE)s_vdxkO@>l^La^=$0b>kR=f+rXmxC@}n)$a9o!f$q=W$ ze=3VCqQD3S^M^>#2L`Kt6$S=^2}2@`4-%PjOsI0NIN>Lm5Cm)M1<7pnT~MEJuZ06Y?=kJfg0BmlCYPlISI zRYNqQO~V^MaRA3~pNlAzsUZ&cmAFnWD&Pm+O?nkDF{u}CF9*&Gc-CZF;3>wC(Vi#7 z_@l`NF?1K=KDTe*Vypu%Z_;^E0KyN5Z-nOB4`MzSLR;9Op)2 z_mTo6#~*7)+CRkK=>p^UBcJym1}gq4hBaXtz4tp2$T&72>>HFlkbcL* zE8aCCyU%fvELqqkZyxH-IvnBVoX_4Ac-LMti`*#VXgK7!s85)h!oJBTqv${uxQJ^D z<6%5ADW!pK-_rDF;_RF48d1yHXW71=|Bt`<4qJGncOYN-irAh}7jSyRuUmq@ir0 zAhq*6JJ+~(v&Tza#mM&(m%VXS&TfhalsoXskX4bEmR8ZwWU8$))z-Asxn7D|PHl21 zf!<$Ndy*9;Lg}dj@Zb!Y9BjQKmAX;csp4-qSdLAl9(IiT2Wvl{yV6rXPQEy?{)qJ+8E;l