大容量的 STM32F103 具有内部 DAC,无线传感器网络实验平台 TDL-02 选择的是2 {8 r% G5 h4 h5 O
STM32F103ZET6 属于大容量产品,所以是带有 DAC 模块的。
9 d$ }4 C$ t3 l) o+ `STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双( t+ Y: t c. k8 U" ~6 }
DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 VREF+以获得更精确的转换结果。
$ H" v" r7 y7 m7 u8 ^2 X: d! \单片机源程序如下:' w5 G, G- j$ o4 @7 ^2 p
- #include "LED.h"/ f, R1 l V3 _( g1 }: A
- #include "delay.h"3 Y+ y' ` \3 d0 x! Y+ }" c
- #include "key.h"
2 }0 ]# ^2 [% C& k x1 w! M - #include "sys.h"& P. `: c/ Y" a2 Z. `* s
- #include "lcd.h"0 f6 m. f' Y/ I$ ^* b
- #include "usart.h"5 @9 L- p8 \# m
- #include "dac.h"+ E) i: v& @. ]: ^- y3 Z! G
- #include "adc.h"" g4 c3 U- f9 U5 t
- int main(void)" \+ E) V" A. j ?9 g% W
- {3 [& g* A, _# @) L( U5 T7 L
- u16 adcx;& r( K* [, Q1 X7 Z7 {7 F
- float temp;$ M S" ~4 f6 c1 p
- u8 t=0;
3 n( q- Y+ S' v3 i- e4 f, J& t - u16 dacval=0;' a+ K% o$ d5 a5 r2 m7 m* u! D: w
- u8 key;
* K8 S8 T+ p# M7 N! p Q) R - delay_init(); //延时函数初始化
: \3 x h0 {: |' c6 B" c) J$ p - NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
_6 H" [+ R8 V; r - uart_init(115200); //串口初始化为1152006 R! E1 u1 u9 Y+ M/ b2 M' E
- KEY_Init(); //初始化按键程序& ^/ m. M2 H3 A" H
- LED_Init(); //LED端口初始化
1 z# O, }$ s0 A! ~( p' b5 V - LCD_Init(); //LCD初始化
+ z; N4 F+ k+ L4 {. z2 f - Adc_Init(); //ADC初始化
- y: b# h5 V. c2 Q! ^ - Dac1_Init(); //DAC初始化& Z) O. c+ W* w, q% g
- POINT_COLOR=RED;//设置字体为红色
9 C& @% _- j& G7 }! Q - LCD_ShowString(60,50,200,16,16,"Sensor STM32");
# G) y, g% A' M$ j - LCD_ShowString(60,70,200,16,16,"Temperature TEST");
, Q. l1 t5 N+ f! v( f - LCD_ShowString(60,90,200,16,16,"Waroyal@DezLinc");: F, `, I" I, d7 N, a; o$ G
- LCD_ShowString(60,110,200,16,16,"2015/9/2");
' d! |" @6 w5 M9 \' l) k - LCD_ShowString(60,130,200,16,16,"KEY2:+ KEY3:-");; @' q1 P" i/ J, D) e b. y' U6 N
- //显示提示信息
1 V! H! u( {, s; d- b/ x - POINT_COLOR=BLUE;//设置字体为蓝色1 k8 x( o: M1 E* v
- LCD_ShowString(60,150,200,16,16,"DAC VAL:");$ j: h$ B. z1 s. N
- LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");8 e8 s; I( R3 D6 @
- LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");% U1 ?& Q/ i+ u) J
- DAC_SetChannel1Data(DAC_Align_12b_R, 0);//初始值为0
; v/ B) o8 G( S) ? - while(1)
1 L- X) h+ J* K( \ - {0 y# g3 G# x( i* ]) F p* I' G
- t++;8 I; x2 f/ p; B" f3 _; J* Z
- key=KEY_Scan(0);" Y9 f$ G8 s7 q8 E, f
- IF(key==KEY2_PRES)
, Q, t9 t" q# V3 [6 n2 @ M5 a - {
4 u9 A# L2 x) ?6 k. [ - if(dacval<4000)dacval+=200;0 T [( I) i6 i5 C, U$ V H2 h7 u4 d$ X
- DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值
1 r" e$ G& D- ~4 ?$ F& { - }else if(key==KEY3_PRES)
0 B% ^$ d6 X6 Z3 T - {
0 f9 b0 g& k/ s* }3 B - if(dacval>200)dacval-=200;
! _& V* E- l/ y _* A) f - else dacval=0;: `7 G5 l1 H9 T3 E3 R
- DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值
1 `* K" M- R1 f+ {! Z# E - }) T' S5 B: d+ M- y( h. d8 l, q
- if(t==10||key==KEY2_PRES||key==KEY3_PRES) //WKUP/KEY1按下了,或者定时时间到了0 S1 q$ |* v) O( @% W/ T# S4 r
- {
4 w5 ^9 ^, x0 m/ T - adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
& { v7 q$ v9 y- O) f - LCD_ShowxNum(124,150,adcx,4,16,0); //显示DAC寄存器值
) v. q! r5 V6 o: f0 P" n, r - temp=(float)adcx*(3.3/4096); //得到DAC电压值
1 K% j1 T& @, P( ?0 N0 A' m9 r/ f - adcx=temp;$ X2 X% C5 }- G" {
- LCD_ShowxNum(124,170,temp,1,16,0); //显示电压值整数部分
$ P! Q+ O& k1 |- k: d - temp-=adcx;( X: Y P. W$ F. ?/ O3 n+ W
- temp*=1000;
8 I5 R( g! K) I' _ - LCD_ShowxNum(140,170,temp,3,16,0X80); //显示电压值的小数部分
5 a( p; f A9 p: C' @ - adcx=Get_Adc_Average(ADC_Channel_1,10); //得到ADC转换值1 T4 K' H/ A' O% t# F. S1 z; o8 s
- temp=(float)adcx*(3.3/4096); //得到ADC电压值' L% ?3 q' ]# _+ K+ D
- adcx=temp;' w7 h, Y6 I4 _7 f* X
- LCD_ShowxNum(124,190,temp,1,16,0); //显示电压值整数部分
3 t2 |& l8 j! L4 Q2 L5 {, z3 \) \ - temp-=adcx;5 p1 e3 Z+ q% W+ ` {/ Z8 E9 {0 p
- temp*=1000;2 B. O" T& ^' ^+ V% M5 Y. U+ R; x
- LCD_ShowxNum(140,190,temp,3,16,0X80); //显示电压值的小数部分
# p% ?; s* T" W+ N8 e; P! I- A - LED0=!LED0;* Q" f8 w) d0 a6 ]" Z$ e7 f
- t=0;: n0 ^* F; q: r; f' u8 i% l
- }
2 j' A9 L7 k0 O: S) T - delay_ms(10);
2 g6 G S6 U; e1 z' J& ?" s - }
1 C9 ]1 n) ^7 U7 B' M/ | - }
0 L7 \, M a# Q$ N) x8 }
复制代码
( \7 B: R' b7 `+ x( L( o8 a8 X9 O |
|