aboutsummaryrefslogtreecommitdiffstats
path: root/notes/dac.txt
blob: 32929360e9c820a16c2110e8d73d5327f9a0b2b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
DAC
-------------------------------------------------------------------------------

There is an ST application note for the DACs; it provides a lot of
context but doesn't help setup the peripheral very much.

For the first code iteration we'll just use 12-bit right-aligned
single writes, or DAC_DHR12Rx.

Once data is loaded into the digital registers, there are a number of
possible triggers to start conversion to analog output: external
interrupts, software control, and timer events. We'll just use
software triggering for now.

There is (obviously) DMA support for DAC output.

There are noise (via LFSR) output and triangle wave output features
with variable amplitude.

There are eleven modes to trigger output to both channels at the same
time, as follows:

    - Independent trigger:
                  (1) No wave generation
                  (2) Same LFSR
                  (3) Different LFSR
                  (4) Same triangle
                  (5) Different triangle
    - (6) Simultaneous software start
    - Simultaneous trigger:
                   (7) Without wave generation
                   (8) Same LFSR
                   (9) Different LFSR
                   (10) Same triangle
                   (11) Different triangle

Buffering is enabled by default.

Triangle Wave HOWTO
-------------------------------------------------------------------------------

In order to generate a full-amplitude triangle wave:

   - Make the following settings in DAC_BASE->CR, for the DAC channel you
     want: set MAMP to 1011 (amplitude 4095), WAVE to 10 (triangle),
     TSEL to 111 (software trigger), TEN to 1 (trigger enabled), and
     EN to 1 (chanel enabled).

   - Set dac->DHR12Rx to 0 (where x is your channel).  This gets added
     to the triangle wave value at each trigger step.

   - Now, forever: set DAC_SWTRIGR_SWTRIGx in dac->SWTRIGR, and wait
     for it to get cleared by hardware.

You can do something similar for noise (by setting WAVE to 01
instead).  You can also cause the waves to advance due to timer events
or external line 9, by making appropriate settings to TSEL.

TODO
-------------------------------------------------------------------------------

- Sine wave demo (using timer interrupts?)
- Wirish implementation
- Official docs
- Higher performance modes?
- Signal quality testing
- DMA output