代码如下,小伙伴们也可以增加波形的类型,使其输出更多的波形
& e8 A; C" }/ d% a# s- #include "dac.h"( W n0 R5 Z0 R5 `1 X5 U/ j# R+ n
- #include <math.h>
l* m/ I- z' Q0 v( [2 u9 y1 S; Z' R - - ]# e/ _/ M, ^( o; g2 y3 D3 |
- Z7 h5 h3 W7 B$ _3 q9 ~
- #define MAXWAVECNT 2005 @9 B- {& }. h5 w& q2 |: q% X9 S* p
- #define WAVECNT 100 //波形的阶数,阶数越大波形拟真度越高,频率会越低) P9 l4 x7 P5 C4 b" L7 G( _
- u16 wavedatatab[MAXWAVECNT] = {0}; //存储任意的波形数据" D n$ r$ d& `; o
- /*自定义波形数据生成
# a! P( b' P; X( V. A! Z' @5 z - Amp为幅值 0~3.3V8 F& g" r$ ~$ p
- offset为偏置 值0~3.3V! {" R6 @& _( J# j; o x
- wavetype为波形类型:
$ g) Y% j1 H. i4 t8 r - 0为正弦波 K z, i$ x0 A7 @
- 1为三角波
7 X3 k' t# m9 o; O. {: p - 2为锯齿波) W+ S/ o. @- m" w. i! P8 ^" t' I
-
9 X p ~6 J5 _( ^ - */) X: e' M$ ^" m
- void GEN_WAVE(float Amp,float offset,u8 wavetype)
8 b L4 p8 d/ g - {, s4 R7 }! K3 X4 f
- u16 tempAmp = Amp*4096/3.3;
0 S& h* `) L2 B" ^ - u16 tempoffset = offset*4096/3.3;
- J- y2 n; r. N8 j5 k - u8 i;
! f2 u$ p& I$ S0 h6 C - u16 step;- Y; H9 h. O1 z; t2 w
- switch(wavetype)" H) Z3 q/ `5 c: e
- {
) ^% }( B) J# G; U- s0 I - case 0: for(i=0 ;i<WAVECNT;i++)
6 z w' Q& _' X5 N2 j( L0 Z- S - {
# j1 R+ C5 Q- o) u# J* M. B; n9 L& U& w - wavedatatab[i] = (u16)( tempAmp*sin(2*3.14*i/WAVECNT)+tempoffset);
4 N) {9 M- L. Z! M/ K6 b. e- e - }2 K8 @: b. m* X$ u w
- break; ~7 ~5 D% W% U/ g1 s
- case 1: step = tempAmp/(WAVECNT/2);
% R9 {5 { ~# l3 r' i6 i( j2 q0 e - for(i=0 ;i<WAVECNT;i++)
) u5 J/ P& F- S* U& t3 t% p - {/ f/ r3 q! u' n
- if(i<(WAVECNT/2)) wavedatatab[i]= i*step+tempoffset;/ x W8 ^ E, N" R
- else wavedatatab[i] = (WAVECNT-i)*step+tempoffset;" k0 e1 I1 g3 ^$ o* K" \
- } + c( D6 P0 \% R& v% N
- break;- T) ]0 ]9 b3 g3 O! X
- case 2: step = tempAmp/WAVECNT;
; M9 t( Y5 f; {3 j- t - for(i=0 ;i<WAVECNT;i++) ' Y( m$ q# t1 {( Z' s! m
- {
# |( `* P s" [4 l% w" v3 t - wavedatatab[i]= i*step+tempoffset;; \. C* p3 O5 W, O
- }
& w% T& @/ n; d0 G# v% X - break; 7 i' ?1 I) \3 ~. `6 v( l
- default:break; $ r. O9 I" x' k& }3 ~
- }( o' n( ?6 @$ Z8 r, Q& i7 D3 {$ d! z1 y
- }
) y& z8 A* C6 U9 h -
) F3 s. K0 p8 p2 H% y x - void TIM2_Int_Init(u16 arr,u16 psc)
3 h: I4 j6 [2 M- R - {# G2 o' o" a' r: R1 D- M
- RCC->APB1ENR|=1<<0; //TIM2时钟使能
. ?8 K$ s/ s% S - TIM2->ARR=arr; //设定计数器自动重装值
4 t6 V6 d; Q& C: v$ ?' I- Y - TIM2->PSC=psc; //预分频器
; k9 f D5 X2 L7 m- J+ K0 t7 \ - TIM2->CR1|=1<<7; //ARPE使能 # \3 {9 e! R3 N( l& u
- TIM2->CR2 |=0x2<<4; //TIMER更新做为TRGO源 d/ x# z! {/ h4 [3 ~
- TIM2->CR1 |=TIM_CR1_CEN; //使能定时器2
# U# p- n2 ^6 M/ C - }) u* B+ G. {0 ]
- void DAC_DMA_init(void)
) R2 w5 [, N) V9 n$ z5 J( [ - {
# }/ w+ z7 o1 s - RCC->AHB1ENR|=1<<21;//DMA1时钟使能 8 \# y) n* _; h, Z6 G8 j
- DMA1_Stream5->PAR=(u32)&(DAC->DHR12R1); //DMA外设地址0 ?" r, A2 t* w9 k1 x. y7 `( K
- DMA1_Stream5->M0AR=(u32)wavedatatab; //DMA 存储器0地址
9 w; M+ j% i5 R& p- N7 `2 O5 J8 H7 c - DMA1_Stream5->NDTR=WAVECNT; //DMA 传输数量$ N9 L8 A4 Q+ `6 D+ q
- DMA1_Stream5->CR=0; //先全部复位CR寄存器值 6 t8 |) s5 u. D
- : B# I3 n2 @; X' c/ t
- DMA1_Stream5->CR|=1<<6; //存储器到外设模式* M \; _" K* |( D* Z7 c: F
- DMA1_Stream5->CR|=1<<8; //循环模式
2 b8 [ T% n* ` - DMA1_Stream5->CR|=0<<9; //外设非增量模式
$ @+ e" ^7 X3 Z0 O; U - DMA1_Stream5->CR|=1<<10; //存储器增量模式
" m! _9 o' e! L# P7 Q1 ~ - DMA1_Stream5->CR|=1<<11; //外设数据长度:16位9 } L- `# q( N5 g. o$ z: M+ X
- DMA1_Stream5->CR|=1<<13; //存储器数据长度:16位
5 Q. s! \( x" `4 B) m0 { - DMA1_Stream5->CR|=1<<16; //中等优先级: v9 p' n6 c$ q5 G
- DMA1_Stream5->CR|=0<<21; //外设突发单次传输
/ S6 \) _0 Y* I/ D" f - DMA1_Stream5->CR|=0<<23; //存储器突发单次传输& m" |% f! v2 ]- m
- DMA1_Stream5->CR|= 0x7<<25;//通道选择! x: g% E' [8 i. c" ^" ^8 H) }% ]
- DMA1_Stream5->CR|= 1<< 0;//开DMA
- H4 E% a8 W9 k: d- g - }' G5 c% @6 g# ]
- 6 {- K1 _' F* {7 N1 b7 S5 d9 d- o% k
- //DDS初始化
2 J0 h( s {* V- G! G - void Dac1_Init(void)
' V/ n% C; W8 M- ^) I5 W - { ! @( ~' _1 }2 M. Y3 Y+ j; F& A
- RCC->APB1ENR|=1<<29; //使能DAC时钟 # J" _1 A( U) u
- RCC->AHB1ENR|=1<<0; //使能PORTA时钟
+ G! e! B! h! Y8 _9 A$ I - GPIO_Set(GPIOA,PIN4,GPIO_MODE_AIN,0,0,GPIO_PUPD_PU);//PA4,模拟输入,下拉 9 V$ e: u; S2 n# z. p
- 0 c% Q. Q `+ o* c% s5 N3 u
- DAC->CR|=1<<0; //使能DAC19 {* H2 Q, ^! K& K
- DAC->CR|=1<<1; //DAC1输出缓存不使能 BOFF1=19 O7 E/ G# L& f4 v2 D) s
- DAC->CR|=1<<2; //使用触发功能 TEN1=1
( M( E$ Q& t4 D6 c- I: }5 Q" T. E - DAC->CR|=4<<3; //DAC TIM2 TRGO,不过要TEN1=1才行6 v! \1 |6 R6 J$ |2 [. ]9 {+ b
- DAC->CR|=0<<6; //不使用波形发生
4 ^! Z+ k0 |6 z6 O+ T& K2 x - DAC->CR|=0<<8; //屏蔽、幅值设置# m7 E0 R, l4 J' q% V
- DAC->CR|=1<<12; //DAC1 DMA使能
& Y+ ]9 k" n7 B, ^5 ]# D - DAC->DHR12R1=0;
( w, u9 D2 c O: |0 c - DAC_DMA_init();
: |8 R+ L' z" R8 g - TIM2_Int_Init(100,0);
0 V& e! q* U5 y* m3 H7 R( R - }" R% }& O: h# k, x7 c
- ' T8 h; m, ]" u0 }4 G C
- void SET_DAC_FRQ(u16 frq)
% l( M0 ~: t3 b; [9 P6 c - {
7 E+ R5 }, C* h0 @ - TIM2->CR1 &=~TIM_CR1_CEN;
( h# M5 {/ l- F* B: W - TIM2->ARR = frq;
/ ?# R6 q5 g" L7 [/ O - TIM2->CR1 |=TIM_CR1_CEN;
0 Z* H9 H$ g R) t; G - }
! E5 F1 _! P3 p0 L$ I; v - : o3 t8 r5 K- }. z: B! [
- void DDS_Output_Wave(float Amp,float offset,u8 wavetype,u16 frq)
+ A- V2 C( x* a2 M; C8 e - {5 p- Q! |8 @- C- Y. Y! w
- DMA1_Stream5->CR&= ~(1<< 0);//关DMA% Q7 x# S' w: y2 j4 I5 {9 @: }
- GEN_WAVE(Amp,offset,wavetype);
+ P0 Z+ _( S! {3 E, z" ~ - SET_DAC_FRQ(frq);
) J5 O9 V/ b) Y' U5 Q) I7 _ E: U) I' o: | - DMA1_Stream5->CR|= (1<< 0);//关DMA. m8 R4 s& s* x' m& g" ?5 s) S+ h3 H
- }
复制代码
8 W- j4 |5 ^( ^7 J" t+ D% `
8 l, j8 z) b6 h3 R& d7 ~' c) s |