历史上的今天
今天是:2024年12月31日(星期二)
2021年12月31日 | STM32F103DAC功能实现
2021-12-31 来源:eefocus
所谓的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+
下面就通过代码来实现模拟信号输出。
#include "dac.h"
void DAC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC , ENABLE);
//PA4设置为为模拟输入,使能DAC通道后,PA4会与DAC模拟输出相连,设置为输入为了避免了干扰
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //设置为模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; //不使用触发功能 TEN1=0
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用波形发生
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0; //屏蔽、幅值设置
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //DAC1输出缓存关闭
DAC_Init(DAC_Channel_1, &DAC_InitStructure); //初始化DAC通道1
DAC_Cmd(DAC_Channel_1, ENABLE); //使能DAC1
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12位右对齐数据格式设置DAC值
}
//设置通道1输出电压
//vol:0--3300,代表0-3.3V
void DAC1_Set_Vol(u16 vol)
{
float temp = vol;
temp /= 1000;
temp = temp * 4096 / 3.3;
DAC_SetChannel1Data(DAC_Align_12b_R, temp);
}
在初始化的时候,要注意一个问题,STM32F103单片机的DAC输出通道有两个。

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

内部自动就会将PA4和PA5与模拟输出引脚连接起来。所以在初始化的时候,虽然用的是输出功能,但是还是要将引脚设置为输入。
初始化引脚之后,接下来初始化DAC功能,在这里不使用触发功能,也不使用波形发生功能。直接通过软件来控制
接下里通过一个函数将要输出的电压值换算为寄存器的设置值。DAC的转换为12位,所以最大值就是2^12,也就是4096,而stm32单片机的供电电压值3.3V,所以将要设置的电压值除以3.3,然后乘以4096就是DAC寄存器需要设置的值。
如果要输出模拟电压值时,只需要在主函数中调用DAC1_Set_Vol()函数,并将要设置的电压值传递给这个函数就行了。
int main(void)
{
u16 adcx;
float temp;
u8 t = 0;
u16 dacval = 0;
u8 key;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
DAC1_Init();
while(1)
{
LED0 = !LED0;
DAC1_Set_Vol(1000);
delay_ms(100);
}
}
在主函数中设置DAC输出的电压值为1000,也就是1V。这时通过万用表就可以在stm32单片机的PA4引脚量到1V的电压值了。
史海拾趣
|
序 言 第一章 系统简介 1 系统组成 1.1 库 1.2 原理图输入 1.3 设计转换和修改管理 1.4 物理设计与加工数据的生成 1.5 高速 PCB 规划设计环境 ...… 查看全部问答> |
|
暂时没分了,此贴会加分,请教:怎样才能在PB里安装NETCFv35.wce.armv4.cab的内容?而不是在设备上安装 NETCFv35.wce.armv4.cab的管方做法是在设备上安装,但是对于大规模生产这个方法不可取。 我们想在PB里直接安装NETCFv35.wce.armv4.cab, 这样编译NK.BIN时,里面就包含了.net cf v3.5; 请教怎么做呢? 非常抱歉现在没分了,但是这个贴子我会加 ...… 查看全部问答> |
|
大家功率放大模块做得怎样啦?有不用BUF634就做出来比较好效果的么 本帖最后由 paulhyde 于 2014-9-15 09:23 编辑 大家功率放大模块做得怎样啦?有不用BUF634就做出来比较好效果的么? 比如带宽多少?负载多少?电流多大?输入信号幅度多大? 我们用通用运放搭的,也做了扩流,可波形出来就是失真啊…… &nb ...… 查看全部问答> |
|
参与Silicon Labs 2014技术创新巡回研讨会,赢新颖大礼 由中国最大本土分销企业世强携手业界领先的高性能混合信号IC供应商Silicon Labs举办的创新技术巡回研讨会将于近期全面启动。本次研讨会主要针对在职研发工程师,Silicon Labs的资深技术专家将亲临现场,带来处于创新最前沿的设计技术 ...… 查看全部问答> |
|
手册上说g2553最高频率是26mhz,那怎么设置它的频率呢。 BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; 我用上面的代码,为啥编译错误呢,求 ...… 查看全部问答> |




