你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F103内部DAC使用源码

[复制链接]
STMCU小助手 发布时间:2022-1-9 20:00
大容量的 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
  1. #include "LED.h"
    * C' b& t# y5 j' y
  2. #include "delay.h"- t4 d. I, R7 g% N& `
  3. #include "key.h"8 R1 s/ k) ~% Q/ K
  4. #include "sys.h"7 x4 n9 ]4 @6 F" w- m9 k7 ^
  5. #include "lcd.h"0 z3 y, Z( G  j
  6. #include "usart.h"
    % f' {0 B" M$ r8 B! I
  7. #include "dac.h"6 ?0 r3 N% M9 J6 u
  8. #include "adc.h"
    ) @4 V7 [; s7 @  ]/ R
  9. int main(void)  S2 F, m1 ?. v  z
  10. {- R2 G" K+ P, e3 c( }* u6 j
  11.         u16 adcx;" ~* t% t: f( L$ A
  12.         float temp;  y; W% t3 r' a4 v
  13.          u8 t=0;
    6 T4 m0 H1 Z2 f: e0 h  P4 ?% N
  14.         u16 dacval=0;
    7 N% g  t3 t# V3 W4 L
  15.         u8 key;
    * c- I5 |1 O, I. X
  16.         delay_init();                     //延时函数初始化8 N$ G  B2 o( R% }; U4 u
  17.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    # m1 W" v+ i1 `$ f$ h
  18.         uart_init(115200);                 //串口初始化为1152009 r' \: N* P5 ]; I& y- i6 i
  19.         KEY_Init();                          //初始化按键程序
    # H! q: X- {( u# W" {9 C
  20.          LED_Init();                             //LED端口初始化9 W$ c7 @/ Z9 C) y0 b1 |% j
  21.         LCD_Init();                                  //LCD初始化3 i$ T! z8 t- F; y# x
  22.          Adc_Init();                                  //ADC初始化
    . x# T+ w3 a3 h% Z/ z# I" d% c
  23.         Dac1_Init();                                //DAC初始化
    # k. [: i9 b. a& A( b
  24.         POINT_COLOR=RED;//设置字体为红色
    ! ]: P- P5 Z# m# Y
  25.         LCD_ShowString(60,50,200,16,16,"Sensor STM32");
    & B- n2 o; O: E& v+ F* G! q2 s) _
  26.         LCD_ShowString(60,70,200,16,16,"Temperature TEST");6 ^) S$ Q  C/ O' T+ q
  27.         LCD_ShowString(60,90,200,16,16,"Waroyal@DezLinc");
    ! A0 C" l9 N: ]
  28.         LCD_ShowString(60,110,200,16,16,"2015/9/2");
    ! m+ _1 M. T& Q( I
  29.         LCD_ShowString(60,130,200,16,16,"KEY2:+  KEY3:-");
    # I6 F  e( Z9 _+ _" c2 i
  30.         //显示提示信息/ }: x4 v$ H" w  W4 e
  31.         POINT_COLOR=BLUE;//设置字体为蓝色
    9 b7 @' r# o  E* Q
  32.         LCD_ShowString(60,150,200,16,16,"DAC VAL:");
    # C% M2 N4 ]- A
  33.         LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");
    & K6 [" u! T! Z5 I& [
  34.         LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");$ g( `  H8 ?% @' v' L
  35.         DAC_SetChannel1Data(DAC_Align_12b_R, 0);//初始值为0
    3 T; C7 M3 b3 }  C* {% j
  36.         while(1)8 F6 K, c! ?* \) i8 m0 I
  37.         {
    1 \7 @* Y' |0 {0 T
  38.                 t++;3 V1 A0 K9 u' n- q, B4 ?0 K: }! I
  39.                 key=KEY_Scan(0);
    1 w: R9 x/ U% P0 T, o5 b
  40.                IF(key==KEY2_PRES)
    , U: e0 }: C+ M
  41.                 {- {* Y+ N+ X; S( `6 u* P
  42.                         if(dacval<4000)dacval+=200;) s  M; `4 ~4 }/ f+ s! s9 u
  43.                         DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值
    % ~, e1 Q; l3 R: H% e
  44.                 }else if(key==KEY3_PRES)+ C7 S8 _2 y: N. s+ H( `
  45.                 {# |) ?/ v/ U  O8 a  T6 I
  46.                         if(dacval>200)dacval-=200;9 i- p. a( f# r. }% u" X" ^0 {1 s$ ?
  47.                         else dacval=0;4 X' p6 k3 u/ t& }% M
  48.                         DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值' a0 F- S* ^' W, |- T6 l& r1 p
  49.                 }
    3 v7 m/ ~  ~9 v3 t8 Z% `0 ]9 c
  50.                 if(t==10||key==KEY2_PRES||key==KEY3_PRES) //WKUP/KEY1按下了,或者定时时间到了
    ( X% H& r- S% v
  51.                 {
    7 B1 P1 g8 t+ A) @/ K0 _* O: E
  52.                         adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值
    ! I, j5 _/ R0 ^; a- Y9 k/ R9 X
  53.                         LCD_ShowxNum(124,150,adcx,4,16,0);             //显示DAC寄存器值9 l- X' }3 A+ T% K0 o8 Z% N
  54.                         temp=(float)adcx*(3.3/4096);                        //得到DAC电压值, V3 ?: y5 X; `8 R# r
  55.                         adcx=temp;
    6 ?3 ?$ ~" T( ^' B+ p6 b
  56.                          LCD_ShowxNum(124,170,temp,1,16,0);             //显示电压值整数部分0 F" @  O6 R9 ?' C6 b* |
  57.                          temp-=adcx;+ v" N0 V, u4 V8 ?
  58.                         temp*=1000;9 U/ _% o/ U! [) o- e
  59.                         LCD_ShowxNum(140,170,temp,3,16,0X80);         //显示电压值的小数部分
    : x$ T3 N8 h: E
  60.                          adcx=Get_Adc_Average(ADC_Channel_1,10);                //得到ADC转换值( ?# g, d4 z& F* J* f
  61.                         temp=(float)adcx*(3.3/4096);                        //得到ADC电压值
    ( I' j- d+ I+ d: b1 r' F
  62.                         adcx=temp;
    + e9 n0 C; q+ N6 g
  63.                          LCD_ShowxNum(124,190,temp,1,16,0);             //显示电压值整数部分  ~6 p/ J- D4 k6 w; e3 T$ v
  64.                          temp-=adcx;
    . A6 D/ z0 `! v5 L1 V1 E1 s
  65.                         temp*=1000;
      y1 V  t+ l3 j: N) |
  66.                         LCD_ShowxNum(140,190,temp,3,16,0X80);         //显示电压值的小数部分& o  X0 H. r, Y! ^9 d/ D# G$ L0 A
  67.                         LED0=!LED0;
    6 X$ V0 E8 Z' X! [+ L1 B
  68.                         t=0;. o7 u7 r6 V$ F+ k
  69.                 }# e. {" b) `$ Y$ {
  70.                 delay_ms(10);+ h6 T: `6 x7 V2 O
  71.         }& z& z+ \- |3 J/ y/ e: x
  72. }$ h0 a3 @/ [: s
复制代码
, ?% D0 r$ ~5 E+ U( j+ t# A
收藏 评论0 发布时间:2022-1-9 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版