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

【经验分享】STM32F103DAC功能实现

[复制链接]
STMCU小助手 发布时间:2022-3-20 13:25
  所谓的DAC功能也就是将数字信号转换为模拟信号,一般情况下使用比较多的就是ADC功能,也就是将模拟信号转换为数字信号,多用于读取传感器的值。但是有时候需要控制某些传感器,需要用模拟信号控制,这就需要将数字信号转换为模拟信号了。

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

DAC 主要特征

2个DAC转换器:每个转换器对应1个输出通道
8位或者12位单调输出
12位模式下数据左对齐或者右对齐
同步更新功能
噪声波形生成
三角波形生成
双DAC通道同时或者分别转换
每个通道都有DMA功能
外部触发转换
输入参考电压V REF+
下面就通过代码来实现模拟信号输出。

  1. #include "dac.h"

  2. void DAC1_Init(void)
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.     DAC_InitTypeDef DAC_InitStructure;

  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  7.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC , ENABLE);

  8.     //PA4设置为为模拟输入,使能DAC通道后,PA4会与DAC模拟输出相连,设置为输入为了避免了干扰
  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  10.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                                                                //设置为模拟输入
  11.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  13.     DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;                                                         //不使用触发功能 TEN1=0
  14.     DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;                         //不使用波形发生
  15.     DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;         //屏蔽、幅值设置
  16.     DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;                                //DAC1输出缓存关闭
  17.     DAC_Init(DAC_Channel_1, &DAC_InitStructure);                                                                 //初始化DAC通道1

  18.     DAC_Cmd(DAC_Channel_1, ENABLE);                                                                                         //使能DAC1
  19.     DAC_SetChannel1Data(DAC_Align_12b_R, 0);                                                                         //12位右对齐数据格式设置DAC值
  20.         
  21. }
  22. //设置通道1输出电压
  23. //vol:0--3300,代表0-3.3V
  24. void DAC1_Set_Vol(u16 vol)
  25. {
  26.     float temp = vol;
  27.     temp /= 1000;
  28.     temp = temp * 4096 / 3.3;

  29.     DAC_SetChannel1Data(DAC_Align_12b_R, temp);
  30. }
复制代码

在初始化的时候,要注意一个问题,STM32F103单片机的DAC输出通道有两个。

S05HG]2@QIXUY6W@SR$IY_O.png

PA4和PA5,但是在初始化引脚的时候,要将PA4和PA5初始化为模拟输入功能。这个在官方文档上也有说明。

%NEMPB$XD{FGUJRE`}06FPW.png

  内部自动就会将PA4和PA5与模拟输出引脚连接起来。所以在初始化的时候,虽然用的是输出功能,但是还是要将引脚设置为输入。

  初始化引脚之后,接下来初始化DAC功能,在这里不使用触发功能,也不使用波形发生功能。直接通过软件来控制

  接下里通过一个函数将要输出的电压值换算为寄存器的设置值。DAC的转换为12位,所以最大值就是2^12,也就是4096,而stm32单片机的供电电压值3.3V,所以将要设置的电压值除以3.3,然后乘以4096就是DAC寄存器需要设置的值。

  如果要输出模拟电压值时,只需要在主函数中调用DAC1_Set_Vol()函数,并将要设置的电压值传递给这个函数就行了。

  1. int main(void)
  2. {
  3.     u16 adcx;
  4.     float temp;
  5.     u8 t = 0;
  6.     u16 dacval = 0;
  7.     u8 key;

  8.     delay_init();
  9.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  10.     uart_init(115200);
  11.     LED_Init();
  12.     DAC1_Init();   
  13.     while(1)
  14.     {
  15.         LED0 = !LED0;
  16.         DAC1_Set_Vol(1000);
  17.         delay_ms(100);
  18.     }
  19. }
复制代码

在主函数中设置DAC输出的电压值为1000,也就是1V。这时通过万用表就可以在stm32单片机的PA4引脚量到1V的电压值了。



收藏 评论0 发布时间:2022-3-20 13:25

举报

0个回答

所属标签

相似分享

官网相关资源

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