完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
|
相关推荐
1个回答
|
|
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结构框图如下示:
DACx 输出电压 = VREF+ * ( DORx / 4095 )
2. 硬件设计 本实验通过D1指示灯来提示系统运行状态,K_UP用来增加DAC输入值,K_DOWN用来减少DAC输入值,输入值的改变将控制DAC_OUT1的电压输出,通过USART1将输出的电压值打印出来 3. 软件设计 3.1 STM32CubeMX设置
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 uint8_t KEY_Scan(uint8_t mode){ static uint8_t key = 1; if(mode == 1){ key = 1; } if(key&&(KEY_UP==1||KEY_DOWN==0||KEY_LEFT==0||KEY_RIGHT==0)){ HAL_Delay(10); key = 0; if(KEY_UP==1) return KEY_UP_PRES; else if(KEY_DOWN==0) return KEY_DOWN_PRES; else if(KEY_LEFT==0) return KEY_LEFT_PRES; else if(KEY_RIGHT==0) return KEY_RIGHT_PRES; } else if(KEY_UP==0&&KEY_DOWN==1&&KEY_LEFT==1&&KEY_RIGHT==1){ key = 1; } return 0; } 在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按键输出电压减小 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1547 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1493 浏览 1 评论
915 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
655 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1544 浏览 2 评论
1845浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
598浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
499浏览 3评论
501浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
483浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-6 02:29 , Processed in 0.715318 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号