历史上的今天
返回首页

历史上的今天

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

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

2021-08-31 来源:eefocus

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按键输出电压减小

推荐阅读

史海拾趣

ADPOW公司的发展小趣事

随着电源管理技术的不断成熟,ADPOW公司开始将技术应用于更多领域,推出了一系列创新产品。这些产品不仅在性能上有所提升,更在外观设计、用户体验等方面进行了优化。同时,公司积极拓展市场,与多家电子设备制造商建立合作关系,将产品广泛应用于手机、电脑、家电等领域。

FINDER公司的发展小趣事

ADPOW公司成立于XXXX年,初期是一个小型电子技术研发团队。创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,带领团队专注于电源管理技术的研发。经过数年的不懈努力,团队成功开发出一款高效、稳定的电源管理芯片,这一技术突破为ADPOW公司后续的发展奠定了坚实的基础。

Everett Charles Technologies (ECT)公司的发展小趣事

随着全球电子产业的快速发展和市场竞争的加剧,ECT不断加快全球化战略的实施。公司在全球范围内设立分支机构,积极拓展海外市场,加强与国际知名企业的合作与交流。同时,ECT也注重培养本土人才和创新能力,不断提升公司的核心竞争力。展望未来,ECT将继续秉承“创新、质量、服务”的理念,致力于成为全球领先的电子测试系统供应商和服务商。

以上五个故事概述了Everett Charles Technologies (ECT) 公司的发展历程和关键节点,每个故事都体现了公司在技术创新、市场拓展和全球化战略方面的努力和成果。这些故事不仅展现了ECT的辉煌过去,也预示着其更加美好的未来。

Chen Yang Technologies GmbH & Co KG公司的发展小趣事

Chen Yang Technologies最初是一家专注于半导体芯片研发的小型公司。在某个关键时期,公司成功研发出了一种低功耗、高性能的芯片技术,这一技术突破立即引起了市场的广泛关注。凭借这一技术,Chen Yang Technologies迅速扩大了其产品线,并开始向全球范围内的电子设备制造商供应芯片。随着市场份额的逐步增长,公司逐渐在电子行业中建立了自己的地位。

Elite Enterprises (H K) Co Ltd公司的发展小趣事

为了进一步提升公司的竞争力和市场份额,Elite Enterprises积极寻求与行业内外的合作伙伴建立战略合作关系。公司与多家知名企业签订了长期合作协议,共同开发新产品、拓展新市场。此外,公司还与一些高校和研究机构建立了产学研合作关系,共同推动LED技术的创新和应用。

Califia Lighting公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,Califia Lighting开始积极寻求与国际市场的合作。他们与多个国家和地区的合作伙伴建立了稳定的合作关系,将产品出口到全球各地。同时,公司还参加了多个国际电子照明展会,与全球同行交流学习,进一步提升了公司的国际影响力。

问答坊 | AI 解惑

求助51单片机在超声波测距的应用 毕业论文

设计基于51单片机超声波测距系统!…

查看全部问答>

QuickSense触摸解决方案教你如何简化开发过程

目前越来越多的电子产品结合高速发展的感测技术,以期改善消费者使用感受,如增加对预测使用者需求的智能化功能,以及通过触摸和直觉式手势实现人机互动,这些先进的人机界面功能往往需要牺牲功耗和性能,并导致更高的软件复杂度,因而对设计环境 ...…

查看全部问答>

Linux内核IP Queue机制的分析(二)­——用户态处理并回传数据包

序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析。三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)­——用户态接收数据包 Linux内核IP Queue机制的分析(二)­—— ...…

查看全部问答>

求ARM接16C554的原理图

高分求ARM接TL16C554(串口扩展)的原理图,我的邮箱mynhz@yahoo.com.cn,谢谢.…

查看全部问答>

求助:怎样编程实现89c51控制320240液晶屏显示的问题

用51控制一个320×240的液晶屏,该液晶屏的驱动芯片是ra8835,需要在屏幕上显示四个设备名称,单片机51的P2口通过继电器连接那四个设备,另有两个按键接在51的2个管脚上,要实现的功能是一个按键用来选择哪个设备,同时能在屏幕上显示当前选择的设 ...…

查看全部问答>

算法与数据结构的课件!~

希望对大家写程序有帮助!~…

查看全部问答>

[求助]LaunchPad自带的虚拟串口识别为COM5,用什么软件连接啊?

[求助]LaunchPad自带的虚拟串口识别为COM5,用什么软件连接啊?试了几个串口工具都只支持COM1-COM4………

查看全部问答>

android开发教材

:Q android你值得拥有!…

查看全部问答>

请问,在CCS环境下调试,可以看到GPIO的状态不?

请问,在CCS环境下调试,可以象单片机那样看到GPIO口的状态不?…

查看全部问答>