Hallo, ich habe an meinem STM32F407 2 DAC Kanäle in Benutzung und würde dort gerne eine Sinus-Waveform mit variabler Phasenbeziehung ausgeben. Sprich die Waveform ist für beide Kanäle die selbe, die Phase soll gerampt werden um einen Kondensatormotor zum Anlaufen zu bewegen. Im Moment nutze ich TIM2 als Trigger um mittels circular DMA (2 DACs, 2 DMA-Kanäle) die Werte aus einer LUT zum jeweiligen DAC-Kanal zu bringen. Das funktioniert auch sehr gut. Die Frequenz lässt sich über den TIM2-reload-value ARR verstellen. Die Zielfrequenz liegt irgendwo zwischen 1 und 1kHz.
1 | #include "main.h" |
2 | |
3 | #define NS 128
|
4 | |
5 | const uint32_t Wave_LUT[NS] = { |
6 | 2048, 2149, 2250, 2350, 2450, 2549, 2646, 2742, 2837, 2929, 3020, 3108, 3193, 3275, 3355, 3431, 3504, 3574, 3639, 3701, 3759, 3812, 3861, 3906, 3946, 3982, 4013, 4039, 4060, 4076, 4087, 4094, 4095, 4091, 4082, 4069, 4050, 4026, 3998, 3965, 3927, 3884, 3837, 3786, 3730, 3671, 3607, 3539, 3468, 3394, 3316, 3235, 3151, 3064, 2975, 2883, 2790, 2695, 2598, 2500, 2400, 2300, 2199, 2098, 1997, 1896, 1795, 1695, 1595, 1497, 1400, 1305, 1212, 1120, 1031, 944, 860, 779, 701, 627, 556, 488, 424, 365, 309, 258, 211, 168, 130, 97, 69, 45, 26, 13, 4, 0, 1, 8, 19, 35, 56, 82, 113, 149, 189, 234, 283, 336, 394, 456, 521, 591, 664, 740, 820, 902, 987, 1075, 1166, 1258, 1353, 1449, 1546, 1645, 1745, 1845, 1946, 2047 |
7 | };
|
8 | |
9 | DAC_HandleTypeDef hdac; |
10 | DMA_HandleTypeDef hdma_dac_ch1; |
11 | DMA_HandleTypeDef hdma_dac_ch2; |
12 | TIM_HandleTypeDef htim2; |
13 | |
14 | int main(void) |
15 | {
|
16 | HAL_Init(); |
17 | SystemClock_Config(); |
18 | MX_GPIO_Init(); |
19 | MX_DMA_Init(); |
20 | MX_DAC1_Init(); |
21 | MX_DAC2_Init(); |
22 | MX_TIM2_Init(); |
23 | HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)Wave_LUT, 128, DAC_ALIGN_12B_R); |
24 | HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_2, (uint32_t*)Wave_LUT, 128, DAC_ALIGN_12B_R); |
25 | HAL_TIM_Base_Start(&htim2); |
26 | |
27 | while (1) |
28 | {
|
29 | |
30 | }
|
31 | }
|
Nun würde ich gerne die Phasenbeziehung zwischen DAC1 und DAC2 im Betrieb veränderbar haben. Konkret soll die Phase später über eine Rampenfunktion geführt werden. Nun stellt sich mir die Frage wie ich am elegantesten die Phase der LUT verändere (wenn möglich ohne eine der beiden LUTs für jede Phasenbeziehung neu zu berechnen). - Dazu fällt mir spontan ein: Start-Adresse des DMA verändern -> geht das, wenn ja wie (circular)? - Welche anderen Möglichkeiten seht ihr? (Asynchroner Start? Wenn ja wie?) Danke