Ich verwende den internen 12bit DAC des atsam4s zum einstellen von
konstanten leveln (also einmal wert ins register schreiben und DAC
refreshen bis zum nächsten wert) und will eigentlich gerne die ganze
Breite von 0 bis VDD als output nutzen können, versorgt wird der µC mit
3V.
Leider ist der maximale Wert, den ich für 0xFFF bekomme 2,56V und der
minimale für 0x000 ca. 0,510V. Dazwischen lässt sich 12bit-stufig alles
einstellen.
Ich verstehe nun nicht, wo die 500mV abstände zum unteren/oberen pegel
herkommen! Wenn der µC resettet wird, sehe ich am oszi am DAC pin kurz
logische 3V, es liegt also nciht daran, dass irgendwo eine Last alles
herunterzieht (was ja auch nur die obere grenze erklären würde).
Initialisiert und verwendet habe ich den DAC unter einbindung des dacc
ASF moduls wie folgt:
1 | /******************************************************
|
2 | * DAC Defs
|
3 | */
|
4 | /** Analog control value (Bias current)*/
|
5 | #define DACC_ANALOG_CONTROL (DACC_ACR_IBCTLCH0(0x02) \
|
6 | | DACC_ACR_IBCTLCH1(0x02) \
|
7 | | DACC_ACR_IBCTLDACCORE(0x01))
|
8 | //! DAC channel used
|
9 | #define DACC_CHANNEL 0 // (PB13)
|
10 | //! DAC register base
|
11 | #define DACC_BASE DACC
|
12 | //! DAC ID
|
13 | #define DACC_ID ID_DACC
|
14 | /********************************************************/
|
15 |
|
16 | void dac_init(){
|
17 |
|
18 | /* Enable clock for DACC */
|
19 | sysclk_enable_peripheral_clock(DACC_ID);
|
20 |
|
21 | /* Reset DACC registers */
|
22 | dacc_reset(DACC_BASE);
|
23 |
|
24 | /* Half word transfer mode */
|
25 | dacc_set_transfer_mode(DACC_BASE, 0);
|
26 |
|
27 | /* Power save:
|
28 | * sleep mode - 0 (disabled)
|
29 | * fast wakeup - 0 (disabled)
|
30 | */
|
31 | dacc_set_power_save(DACC_BASE, 0, 0);
|
32 |
|
33 | /* Timing:
|
34 | * refresh - 0x08 (1024*8 dacc clocks)
|
35 | * max speed mode - 0 (disabled)
|
36 | * startup time - 0x10 (1024 dacc clocks)
|
37 | */
|
38 | dacc_set_timing(DACC_BASE, 0x08, 0, 0x10);
|
39 |
|
40 | /* Disable TAG and select output channel DACC_CHANNEL */
|
41 | dacc_set_channel_selection(DACC_BASE, DACC_CHANNEL);
|
42 |
|
43 | /* Disable Trigger -Free run mode */
|
44 | dacc_disable_trigger(DACC_BASE);
|
45 |
|
46 | /* Set up analog control */
|
47 | dacc_set_analog_control(DACC_BASE, DACC_ANALOG_CONTROL);
|
48 |
|
49 | /* Enable output channel DACC_CHANNEL */
|
50 | dacc_enable_channel(DACC_BASE, DACC_CHANNEL);
|
51 | }
|
Kennt jemand das oben beschriebene Problem und hat ähnliches erlebt -
und weiß woran es liegt? Ich habe im Datenblatt weder offset
konfiguration noch eine Begrenzung des ausgangslevels finden (in den
electrical characteristics) können..