aboutsummaryrefslogtreecommitdiffstats
path: root/notes/dac.txt
blob: e6c9b7b1486574536ba1a27ec9593d232e38c7d0 (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

DAC notes (for maple native and other "high density" STM32 devices)
-------------------------------------------------------------------------------
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, 
so use 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 will be enabled by default.

HOWTOs
-------------------------------------------------------------------------------

In order to generate a full-amplitude triangle wave:

   - Make the following settings in dac->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
- documentation
- higher performance modes?
- signal quality testing
- DMA output