大容量的 STM32F103 具有内部 DAC,无线传感器网络实验平台 TDL-02 选择的是3 m: O9 u* n3 {4 C0 F; [7 \1 n$ P' q
STM32F103ZET6 属于大容量产品,所以是带有 DAC 模块的。
z. ~7 w) d; A( MSTM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双
7 m W6 z! H# _0 U8 D, V) qDAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 VREF+以获得更精确的转换结果。
2 r( m. n; E; c5 @4 Y+ V单片机源程序如下:$ p: @; b/ P9 w8 A8 I8 y
- #include "LED.h"
* C' b& t# y5 j' y - #include "delay.h"- t4 d. I, R7 g% N& `
- #include "key.h"8 R1 s/ k) ~% Q/ K
- #include "sys.h"7 x4 n9 ]4 @6 F" w- m9 k7 ^
- #include "lcd.h"0 z3 y, Z( G j
- #include "usart.h"
% f' {0 B" M$ r8 B! I - #include "dac.h"6 ?0 r3 N% M9 J6 u
- #include "adc.h"
) @4 V7 [; s7 @ ]/ R - int main(void) S2 F, m1 ?. v z
- {- R2 G" K+ P, e3 c( }* u6 j
- u16 adcx;" ~* t% t: f( L$ A
- float temp; y; W% t3 r' a4 v
- u8 t=0;
6 T4 m0 H1 Z2 f: e0 h P4 ?% N - u16 dacval=0;
7 N% g t3 t# V3 W4 L - u8 key;
* c- I5 |1 O, I. X - delay_init(); //延时函数初始化8 N$ G B2 o( R% }; U4 u
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
# m1 W" v+ i1 `$ f$ h - uart_init(115200); //串口初始化为1152009 r' \: N* P5 ]; I& y- i6 i
- KEY_Init(); //初始化按键程序
# H! q: X- {( u# W" {9 C - LED_Init(); //LED端口初始化9 W$ c7 @/ Z9 C) y0 b1 |% j
- LCD_Init(); //LCD初始化3 i$ T! z8 t- F; y# x
- Adc_Init(); //ADC初始化
. x# T+ w3 a3 h% Z/ z# I" d% c - Dac1_Init(); //DAC初始化
# k. [: i9 b. a& A( b - POINT_COLOR=RED;//设置字体为红色
! ]: P- P5 Z# m# Y - LCD_ShowString(60,50,200,16,16,"Sensor STM32");
& B- n2 o; O: E& v+ F* G! q2 s) _ - LCD_ShowString(60,70,200,16,16,"Temperature TEST");6 ^) S$ Q C/ O' T+ q
- LCD_ShowString(60,90,200,16,16,"Waroyal@DezLinc");
! A0 C" l9 N: ] - LCD_ShowString(60,110,200,16,16,"2015/9/2");
! m+ _1 M. T& Q( I - LCD_ShowString(60,130,200,16,16,"KEY2:+ KEY3:-");
# I6 F e( Z9 _+ _" c2 i - //显示提示信息/ }: x4 v$ H" w W4 e
- POINT_COLOR=BLUE;//设置字体为蓝色
9 b7 @' r# o E* Q - LCD_ShowString(60,150,200,16,16,"DAC VAL:");
# C% M2 N4 ]- A - LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");
& K6 [" u! T! Z5 I& [ - LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");$ g( ` H8 ?% @' v' L
- DAC_SetChannel1Data(DAC_Align_12b_R, 0);//初始值为0
3 T; C7 M3 b3 } C* {% j - while(1)8 F6 K, c! ?* \) i8 m0 I
- {
1 \7 @* Y' |0 {0 T - t++;3 V1 A0 K9 u' n- q, B4 ?0 K: }! I
- key=KEY_Scan(0);
1 w: R9 x/ U% P0 T, o5 b - IF(key==KEY2_PRES)
, U: e0 }: C+ M - {- {* Y+ N+ X; S( `6 u* P
- if(dacval<4000)dacval+=200;) s M; `4 ~4 }/ f+ s! s9 u
- DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值
% ~, e1 Q; l3 R: H% e - }else if(key==KEY3_PRES)+ C7 S8 _2 y: N. s+ H( `
- {# |) ?/ v/ U O8 a T6 I
- if(dacval>200)dacval-=200;9 i- p. a( f# r. }% u" X" ^0 {1 s$ ?
- else dacval=0;4 X' p6 k3 u/ t& }% M
- DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值' a0 F- S* ^' W, |- T6 l& r1 p
- }
3 v7 m/ ~ ~9 v3 t8 Z% `0 ]9 c - if(t==10||key==KEY2_PRES||key==KEY3_PRES) //WKUP/KEY1按下了,或者定时时间到了
( X% H& r- S% v - {
7 B1 P1 g8 t+ A) @/ K0 _* O: E - adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
! I, j5 _/ R0 ^; a- Y9 k/ R9 X - LCD_ShowxNum(124,150,adcx,4,16,0); //显示DAC寄存器值9 l- X' }3 A+ T% K0 o8 Z% N
- temp=(float)adcx*(3.3/4096); //得到DAC电压值, V3 ?: y5 X; `8 R# r
- adcx=temp;
6 ?3 ?$ ~" T( ^' B+ p6 b - LCD_ShowxNum(124,170,temp,1,16,0); //显示电压值整数部分0 F" @ O6 R9 ?' C6 b* |
- temp-=adcx;+ v" N0 V, u4 V8 ?
- temp*=1000;9 U/ _% o/ U! [) o- e
- LCD_ShowxNum(140,170,temp,3,16,0X80); //显示电压值的小数部分
: x$ T3 N8 h: E - adcx=Get_Adc_Average(ADC_Channel_1,10); //得到ADC转换值( ?# g, d4 z& F* J* f
- temp=(float)adcx*(3.3/4096); //得到ADC电压值
( I' j- d+ I+ d: b1 r' F - adcx=temp;
+ e9 n0 C; q+ N6 g - LCD_ShowxNum(124,190,temp,1,16,0); //显示电压值整数部分 ~6 p/ J- D4 k6 w; e3 T$ v
- temp-=adcx;
. A6 D/ z0 `! v5 L1 V1 E1 s - temp*=1000;
y1 V t+ l3 j: N) | - LCD_ShowxNum(140,190,temp,3,16,0X80); //显示电压值的小数部分& o X0 H. r, Y! ^9 d/ D# G$ L0 A
- LED0=!LED0;
6 X$ V0 E8 Z' X! [+ L1 B - t=0;. o7 u7 r6 V$ F+ k
- }# e. {" b) `$ Y$ {
- delay_ms(10);+ h6 T: `6 x7 V2 O
- }& z& z+ \- |3 J/ y/ e: x
- }$ h0 a3 @/ [: s
复制代码 , ?% D0 r$ ~5 E+ U( j+ t# A
|
|