第二十八天-DAC数模转换实验
一、DAC模块简介
1、DAC概念
2、主要特点
二、DAC转化过程
上侧是一些外部触发和软件触发。
我们写数字到DHRx中,经过一定的周期,控制逻辑将数字信号发送给DORx,然后传送至转换器,经转换后,从DAC_OUTx输出。
三、DAC数据格式
四、DAC触发方式
五、DAC输出
DAC缓存减少输出阻抗,增强驱动能力。
输出阻抗大,驱动能力弱。
输出阻抗小,输出能力强。
六、DAC相关寄存器
七、详细实验
1、实验要求
使用ADC测DAC的电压。
KEY1按下时,增加0.1的电压值。
KEY0按下时,减少0.1的电压值。
支持连按。
1、硬件连接
将ADC引脚和DAC引脚用跳线帽连接在一起。
2、配置步骤
3、详细代码
①dac.h
#ifndef __DAC_H
#define __DAC_H#include "sys.h"u8 Dac_Init();
u16 Get_DigVal();
float Cov_VolVal(u16 DigVal);
void AddVolValue(float val);
void SubVolValue(float val);
u8 Dis_DigVal();#endif
②dac.c
#include "dac.h"
#include "lcd.h"
u8 Dac_Init()
{//时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA PA4初始化GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);//DAC初始化DAC_DeInit();DAC_InitTypeDef DAC_InitStruct;DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;DAC_InitStruct.DAC_Trigger = DAC_Trigger_None;DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None; DAC_Init(DAC_Channel_1,&DAC_InitStruct);//DAC_CmdDAC_Cmd(DAC_Channel_1,ENABLE);//初始化数值DAC_SetChannel1Data(DAC_Align_12b_R,1000);}u16 Get_DigVal()
{return DAC_GetDataOutputValue(DAC_Channel_1);
}//DigVal 0~4095
float Cov_VolVal(u16 DigVal)
{return (float)DigVal / 4096 * 3.3;
}void AddVolValue(float val)
{//反向计算增加值u16 DigValAdd = (float)val * 4096 / 3.3;u16 DigValOld = DAC_GetDataOutputValue(DAC_Channel_1);u16 DigValNew = DigValAdd + DigValOld;if(DigValNew >= 4096)DigValNew = 0;DAC_SetChannel1Data(DAC_Channel_1,DigValNew);
}
void SubVolValue(float val)
{//反向计算减小值u16 DigValSub = (float)val * 4096 / 3.3;u16 DigValOld = DAC_GetDataOutputValue(DAC_Channel_1);u16 DigValNew = DigValOld - DigValSub;if(DigValNew <= 4096)DigValNew = 0;DAC_SetChannel1Data(DAC_Channel_1,DigValNew);
}
u8 Dis_DigVal()
{u16 DigVal = Get_DigVal();float AnoVal = Cov_VolVal(DigVal);u8 AnoVal1 = AnoVal;u8 AnoVal2 = (AnoVal - AnoVal1) *10;LCD_ShowNum(144,50,DigVal,4,24);LCD_ShowNum(144,74,AnoVal1,1,24);LCD_ShowNum(168,74,AnoVal2,1,24);}
③main.c
#include "stm32f10x.h"
#include "rtc.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "wkup.h"
#include "adc.h"
#include "tsensor.h"
#include "lsensor.h"
#include "dac.h"
#include "key.h"/************************************************ALIENTEK 战舰STM32F103开发板实验0工程模板注意,这是手册中的新建工程章节使用的main文件 技术支持:www.openedv.com淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK
************************************************/int main(void){ u16 t = 0;delay_init();uart_init(115200);LED_Init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RTC_Init();LCD_Init(); Adc_Init();Dac_Init();LCD_ShowString(60,50,200,24,24,"DACVAL: ");LCD_ShowString(60,74,200,24,24,"DACVOL: ");LCD_ShowString(156,74,200,24,24,".");LCD_ShowString(60,98,200,24,24,"ADCVAL: ");LCD_ShowString(60,120,200,24,24," - - ");LCD_ShowString(60,174,200,24,24," : : ");while(1){++t;if(t % 100 == 0){LED0 =! LED0;}Dis_DigVal();Dis_Vol(ADC_Channel_1,10);//点击key0 加0.1if(KEY_Scan(1) == k0_pres){AddVolValue(0.1);}if(KEY_Scan(1) == k1_pres){SubVolValue(0.1);}delay_ms(10);}}