历史上的今天

今天是:2024年08月31日(星期六)

2021年08月31日 | 玩转STM32CubeMX | DAC数模转换

发布者:烟雨江湖 来源: eefocus关键字:STM32CubeMX  DAC  数模转换 手机看文章 扫描二维码
随时随地手机看文章

1.DAC数模转换

DAC(digital to analog converter)即数模转换器,它可以将数字信号转换为模拟信号,它的功能与ADC相反。在常见的数字信号系统中,大部分传感器信号被转化成电压信号,而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后,再由DAC输出电压模拟信号来驱动某些执行器件,使人类易于感知。如音频信号的采集和还原就是这样的一个过程


STM32F1的DAC模块是12位数字输入,电压输出型的DAC。可以配置为8位或12位模式,也可以与DMA控制器配合使用,DAC工作在12位模式下时,数据可以设置为左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。DAC结构框图如下示:

  • VDDA和VSSA是DAC模块的供电引脚,VREF+是DAC模块的参考电压,DAC_OUTx是DAC的输出通道;当参考电压为VREF+时,DAC的输出电压是线性的(0~ VREF+),12位模式下DAC输出电压计算公式如下:
    ** DACx 输出电压 = VREF+ * ( DORx / 4095 )**

  • DAC输出是受DORx 寄存器直接控制的,但是不能直接往DORx 寄存器写入数据,而是要通过DHRx间接的传给DORx 寄存器,实现对DAC输出的控制。如果未选择硬件触发,1个APB1时钟周期后,DHRx中存储的数据将自动转移到DORx 寄存器;如果选择硬件触发,将在3个APB1时钟周期后进行转移

  • 当DORx加载了DHRx内容时,模拟输出电压将在一端时间tSETTING后可用,具体取决于电源电压和模拟输出负载,可以从数据手册查到tSETTING的典型值为3us,最大值为4us,因此DAC的转换速度最快是250K左右

  • DAC可通过外部事件(定时器、外部中断线)触发转换,外部触发源列表如下示

2.硬件设计

本实验通过D1指示灯来提示系统运行状态,K_UP用来增加DAC输入值,K_DOWN用来减少DAC输入值,输入值的改变将控制DAC_OUT1的电压输出,通过USART1将输出的电压值打印出来


* 指示灯D1

* USART1串口

* DAC_OUT1(PA4)

* K_UP和K_DOWN按键


3.软件设计

3.1 STM32CubeMX设置
➡️ RCC设置外接HSE,时钟设置为72M
➡️ PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
➡️ USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
➡️ PA0设置为GPIO输入模式、下拉模式;PE3设置为GPIO输入模式、上拉模式
➡️ 激活DAC_OUT1,关闭输出缓冲,不使用触发功能


➡️输入工程名,选择路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码


3.2 MDK-ARM软件编程

➡️ 在dac.c文件中可以看到DAC初始化相关函数


void MX_DAC_Init(void){

  DAC_ChannelConfTypeDef sConfig = {0};

  /** DAC Initialization */

  hdac.Instance = DAC;

  if (HAL_DAC_Init(&hdac) != HAL_OK){

    Error_Handler();

  }

  /** DAC channel OUT1 config */

  sConfig.DAC_Trigger = DAC_TRIGGER_NONE; //不使用触发功能

  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; //输出缓冲关闭

  if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK){

    Error_Handler();

  }

}


void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle){

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  if(dacHandle->Instance==DAC)  {

  /* DAC clock enable */

  __HAL_RCC_DAC_CLK_ENABLE(); //使能DAC时钟

  __HAL_RCC_GPIOA_CLK_ENABLE();

  GPIO_InitStruct.Pin = GPIO_PIN_4;

  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;    //模拟

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  }

}


➡️ 添加按键驱动文件key.c 和相关头文件key.h,参考按键输入例程

➡️ 在main.c文件下编写DAC测试代码


int main(void){

  /* USER CODE BEGIN 1 */

  uint16_t dac_val; //读取的DAC值

  float dac_vol; //转换后的电压值

  uint8_t t = 0;

  uint16_t dac_setval = 0; //DAC设置值

  uint8_t key;

  /* USER CODE END 1 */

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

  MX_DAC_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */

  HAL_DAC_Start(&hdac,DAC_CHANNEL_1); //开启DAC通道1

  HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0);//置初始值为0

  /* USER CODE END 2 */

  while (1){

    t++;

    key = KEY_Scan(0);

    if(key == KEY_UP_PRES){

      if(dac_setval < 4000)

      dac_setval += 200;

      HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dac_setval);

    }

    else if(key == KEY_DOWN_PRES){

      if(dac_setval > 200)

dac_setval -= 200;

      else

dac_setval = 0;

      HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dac_setval);

    }

    /按键按下了或定时时间到

    if(t == 10 || key == KEY_UP_PRES || key == KEY_DOWN_PRES){ /

      dac_val = HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1);

      printf("DAC_OUT1 DAC value: %drn",dac_val);

      dac_vol = dac_val * (3.3/4096);

      printf("DAC_OUT1 VOL value: %.2fVrn",dac_vol);

      printf("rn");

      t = 0;

    }

    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);

    HAL_Delay(100);

  }

}


4.下载验证

图片

编译无误后下载到开发板,可用看到D1指示灯不断闪烁,同时打印出DAC通道1的DAC值和电压值,当按下K_UP按键输出电压增大,按下K_DOWN按键输出电压减小

关键字:STM32CubeMX  DAC  数模转换 引用地址:玩转STM32CubeMX | DAC数模转换

上一篇:玩转STM32CubeMX | SPI总线
下一篇:玩转STM32CubeMX | 跑马灯

推荐阅读

近期车船税新规的出炉,让新能源汽车再获“红利”,然而从新能源政策的形势来看,补贴毫无疑问在走向退坡,到2020年补贴甚至将全面退坡。经过近十年的高速发展之后,新能源汽车进入了后补贴时代。 此前在政府及市场的双重扶持下,新能源汽车一路飞驰。电动汽车资源网了解到,我国2018年1-6月累计销售新能源乘用车约35万辆,同比增长123%。其中,纯电动...
2015年,达芬奇手术机器人剥葡萄皮的视频在YouTube上公布,一时技惊四座。而今,现有的手术机器人已经可以做到在不破坏薄膜前提下剥鹌鹑蛋,缝合2毫米超细胶管后无液体渗漏,而这一次,背后技术力量来自国内的器械企业深圳市精锋医疗科技有限公司。 了解到,精锋医疗研发的单孔手术机器人突破了达芬奇手术机器人在中国的专利封锁,并早在2018年5月就开...
守林员小陈每天的工作,大部分时间都用来在林间巡逻,以便第一时间发现安全隐患。枯燥繁重的工作让年轻的他有点郁闷。 有天他举着朋友圈里转发的文章问领导,听说有地方都能用 AI 来识别山火了,咱们啥时候能用上啊,以后我也算半个用电脑上班的白领了。 领导懒得搭理他,新的智能监控摄像机刚安装不久,图像质量提升了不说,目标识别、异常行为监控之类的...
  阻旋料位开关又称“阻旋开关”、“阻旋式料位开关”等,主要用于各种物料(如粉状、颗粒状或块状)料仓极限料位的自动检测与控制,不同型号的阻旋料位开关可满足不同工况的要求,在冶金、粮食、面粉,建材,水泥、电力、煤炭、化工、铸造、橡胶、环保除尘等各行各业的物料输送与控制过程中有着广泛的应用。为使用户更好地了解和使用阻旋料位开关,现将...

史海拾趣

问答坊 | AI 解惑

模拟电路基础教程(电子书)

大家来下啊 http://www.netyi.net/Resource/13373d8c-cc93-4c91-b5d2-199c75f46cf8.aspx…

查看全部问答∨

单片机的技术发展史

主题:单片机的技术发展史 发帖人:工控初学者 2005-12-14 14:10:29 内容: 单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。 1.SCM即单片微型计算机(Single Chip Microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳 ...…

查看全部问答∨

菜鸟向高手

各为前辈 大哥 大姐 有谁有有关PCB排板的精谈资料 发晚辈一份 在此万分感谢…

查看全部问答∨

利用DB SDK短信成功应用于证券行业

证券行业普遍面临的问题: 信息交互问题:信息传递的时间段集中、信息交互量大,交互次数频繁,难以实现数据集中以及实时交互管理; 资讯服务问题:股市行情多变,客户不便随时随地及时准确的了解交易情况和信息; 系统及数据安全; 客户管理; ...…

查看全部问答∨

找工作的看过来

我公司最近狂招人!职位有结构,电子,软件。…

查看全部问答∨

请教edge编程开发问题

请教在进行基于edge的程序开发时,是否和基于gprs的开发代码是兼容的?还是要另外根据edge的特点来写代码? 哪里有相关编程资料了? 谢谢! …

查看全部问答∨

波特率的问题请教

我对硬件不怎么了解,想问一下如果发送的硬件的波特率是19200,接收的波特率是9600,这之间可以进行准确通信么,就是19200的向9600的发送数据,后者可以识别发送的具体是什么么? 谢谢 …

查看全部问答∨

485通讯大家谈

各位大侠好,最近遇到一个实际问题,和大家分享一下. 485通讯在家没有问题,然而到了工作现场,工作一段时间就不行了.拿到家里来又没有问题了. 奇怪? 另外现场总线的长度有个500~600m吧,我用的波特率为:2400; 现场接线属于星形接法,总线型在现场不 ...…

查看全部问答∨

C2000最小系统板你最想DIY哪一种型号的?

大家来说说C2000最小系统板你最想DIY哪一种型号…

查看全部问答∨

EXTI 寄存器中挂起寄存器(EXTI_PR)的问题

本人stm32还未入门者,图中画红线的这句话令我犯晕,既然该位被置’1’ 。为什么在该位中写入’1’可以清除它??各位大神求解释 …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved