历史上的今天
返回首页

历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2018年10月17日 | 52. STM32的DAC实验

2018-10-17 来源:eefocus

一。数模转换DAC的原理

STM32的DAC的局限性:

只有大容量的STM32F103x(Flash在256K以上)的型号才有DAC功能。

1. 数模转换原理

52. <wbr>STM32的DAC实验
DAC模块有2个转换器,每个转换有一个通道。

2. STM32DAC模块的主要特点

52. <wbr>STM32的DAC实验

3. DAC模块框图

52. <wbr>STM32的DAC实验
(1)DAC1对应PA4

        DAC2对应PA5

(2)数字写在DHRx中,经过一定的时间才转到DORx寄存器中,DORx寄存器我们不能直接写。  

(3)可以通过外部触发转换。

(4)可以产生DMA请求。

52. <wbr>STM32的DAC实验

使用DAC来输出到PA4或PA5,要把PA4或PA5设置成模拟输入。

4. DAC转换

52. <wbr>STM32的DAC实验
(1)对于DAC_DHRx寄存器根据对齐方式,8位或12位数据,有6个寄存器,每个通道有3个,比如8位的左对齐,12位的左对齐,12位的右对齐,以哪种方式就要写入相应的寄存器。

(2)如果没有选择外部触发,存入寄存器DHRx的数据就会在一个APB1时钟后存入DORx寄存器。

(3)一旦数据传到DORx寄存器后,在经过时间T之后才会反应到相应的引脚。

5. DAC的数据格式

52. <wbr>STM32的DAC实验

6. 选择DAC的触发方式

可以选择外部的触发事件:

52. <wbr>STM32的DAC实验

7. DAC的输出电压的计算

DAC输出 = Vref * ( DOR / 4095)

52. <wbr>STM32的DAC实验

例: DOR中的数字是100,参考电压是3.3V,那么输出就是 3.3 * 100 / 4095

二。寄存器库函数配置

1. DAC相关的寄存器

52. <wbr>STM32的DAC实验
我们不能直接去写DOR寄存器,可以写入DHRx寄存器,经过一定事件自动转入DOR寄存器。

1. DAC控制寄存器 DAC_CR

52. <wbr>STM32的DAC实验

2. DAC的配置步骤

52. <wbr>STM32的DAC实验
52. <wbr>STM32的DAC实验
52. <wbr>STM32的DAC实验

三。实验程序讲解

1. 硬件连接

52. <wbr>STM32的DAC实验
DAC用到PA4引脚输出模拟量

在ADC实验中PA1用来测量模拟输入。

在实验中为了方便测试,可以用跳线帽把这两个引脚连在一起,我们可以通过DAC控制输出模拟量,然后在用STM32的ADC来测量模拟量。

52. <wbr>STM32的DAC实验

2. 程序讲解

(1)dac.c

//DAC通道1输出初始化

void Dac1_Init(void)

{

  

GPIO_InitTypeDef GPIO_InitStructure;

DAC_InitTypeDef DAC_InitType;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );  //使能PORTA通道时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );  //使能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);

GPIO_SetBits(GPIOA,GPIO_Pin_4) ;//PA.4 输出高

DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 TEN1=0

DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生

DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置

DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1输出缓存关闭 BOFF1=1

                                                                                                                否则DAC不能输出到0.

    DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化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);//12位右对齐数据格式设置DAC值

}

2. 主函数main.c

int main(void)

 {  

u16 adcx;

float temp;

  u8 t=0;  

u16 dacval=0;

u8 key;

delay_init();     //延时函数初始化  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

uart_init(115200); //串口初始化为115200

KEY_Init();  //初始化按键程序

  LED_Init();     //LED端口初始化

LCD_Init(); //LCD初始化

usmart_dev.init(72); //初始化USMART

  Adc_Init();   //ADC初始化

Dac1_Init(); //DAC初始化

POINT_COLOR=RED;//设置字体为红色 

LCD_ShowString(60,50,200,16,16,"WarShip STM32");

LCD_ShowString(60,70,200,16,16,"DAC TEST");

LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(60,110,200,16,16,"2015/1/15");

LCD_ShowString(60,130,200,16,16,"WK_UP:+  KEY1:-");

//显示提示信息      

POINT_COLOR=BLUE;//设置字体为蓝色

LCD_ShowString(60,150,200,16,16,"DAC VAL:");      

LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V");      

LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V");

DAC_SetChannel1Data(DAC_Align_12b_R, 0);//初始值为0          

while(1)

{

t++;

key=KEY_Scan(0);  

if(key==WKUP_PRES)

{  

if(dacval<4000)dacval+=200;

DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值

}else if(key==KEY1_PRES)

{

if(dacval>200)dacval-=200;

else dacval=0;

 DAC_SetChannel1Data(DAC_Align_12b_R, dacval);//设置DAC值

}  

if(t==10||key==KEY1_PRES||key==WKUP_PRES) //WKUP/KEY1按下了,或者定时时间到了

{  

adcx=DAC_GetDataOutputValue(DAC_Channel_1);//读取前面设置DAC的值

LCD_ShowxNum(124,150,adcx,4,16,0);     //显示DAC寄存器值

temp=(float)adcx*(3.3/4096); //得到DAC电压值

adcx=temp;

  LCD_ShowxNum(124,170,temp,1,16,0);     //显示电压值整数部分

  temp-=adcx;

temp*=1000;

LCD_ShowxNum(140,170,temp,3,16,0X80); //显示电压值的小数部分

  adcx=Get_Adc_Average(ADC_Channel_1,10); //得到ADC转换值  

temp=(float)adcx*(3.3/4096); //得到ADC电压值

adcx=temp;

  LCD_ShowxNum(124,190,temp,1,16,0);     //显示电压值整数部分

  temp-=adcx;

temp*=1000;

LCD_ShowxNum(140,190,temp,3,16,0X80); //显示电压值的小数部分

LED0=!LED0;   

t=0;

}    

delay_ms(10);

}

 }

52. <wbr>STM32的DAC实验


推荐阅读

史海拾趣

台湾三礼(3L)公司的发展小趣事

1991年,三礼公司正式成立了美国分公司(3LU),此举标志着公司开始进军北美市场,将其作为货物管理中心,并与G-TEP合作组建了3L Global Co.(3LG),共同开拓和发展所有北美业务。这一战略决策为三礼公司打开了新的增长通道,使得公司能够更好地服务全球客户,提升品牌影响力。

ESPROS [Espros Photonics corp]公司的发展小趣事

ESPROS Photonics corp(以下简称ESPROS)于2006年由Beat De Coi先生创立,总部位于瑞士。公司成立之初,就专注于芯片设计、集成与制造领域,依托其独特的光学工艺技术,为客户提供高性能的光电传感器解决方案。在中国上海,ESPROS设立了专门的芯片设计中心及技术支持部门,以更好地服务亚洲市场。

BH Electronics公司的发展小趣事

BH Electronics的创立源于创始人李明对电子技术的深厚兴趣和敏锐洞察。在20世纪90年代初,电子市场刚刚起步,李明凭借对市场的精准判断,决定投身于这一新兴行业。他带领一支小团队,在简陋的办公室中开始了艰苦的创业历程。他们昼夜兼程,研发出了一款具有竞争力的电子元件,成功打开了市场的大门。虽然初期资金匮乏,市场认可度低,但李明和他的团队凭借坚韧不拔的精神,逐步在市场中站稳了脚跟。

Big-Sun Electronics Co Ltd公司的发展小趣事

随着国内市场的逐步饱和,Big-Sun Electronics Co Ltd公司开始将目光投向国际市场。公司积极参与国际电子展会,与海外客户建立起了良好的合作关系。同时,Big-Sun还与国际知名电子企业开展技术合作,共同研发新产品,进一步提升了公司的国际竞争力。

DESOUTTER公司的发展小趣事

2001年,Desoutter公司与CP(Chicago Pneumatic)和GR(Grorges Renault)合并,成立了CPDI公司。这次合并使Desoutter公司获得了更强大的技术实力和市场资源,进一步巩固了其在气动工具领域的领先地位。合并后,CPDI公司继续致力于气动工具的研发和生产,并推出了一系列创新产品,以满足市场的不断变化和升级需求。

Aleph America Corporation公司的发展小趣事

2001年,Desoutter公司与CP(Chicago Pneumatic)和GR(Grorges Renault)合并,成立了CPDI公司。这次合并使Desoutter公司获得了更强大的技术实力和市场资源,进一步巩固了其在气动工具领域的领先地位。合并后,CPDI公司继续致力于气动工具的研发和生产,并推出了一系列创新产品,以满足市场的不断变化和升级需求。

问答坊 | AI 解惑

等离子刻蚀

等离子体刻蚀(也称干法刻蚀)是集成电路制造中的关键工艺之一,其目的是完整地将掩膜图形复制到硅片表面,其范围涵盖前端CMOS栅极(Gate)大小的控制,以及后端金属铝的刻蚀及Via和Trench的刻蚀。在今天没有一个集成电路芯片能在缺乏等离子体刻蚀 ...…

查看全部问答>

基于DTMF制式的中文来电显示装置!(转)

本帖最后由 paulhyde 于 2014-9-15 03:39 编辑 下载 (40.56 KB) 2008-12-9 10:28 一、序言    这里将介绍一个小型电子设计和制作的基本方法,从构思到最后制作完成的整个过程。这是一个基于DTMF制式的中文来电显示装置,这是本人的原创 ...…

查看全部问答>

谁做过指纹模块,给我指点指点

我没做过指纹模块,希望大家能给点思路,还有那个手册上的指令我都不知道怎么拼接,能不能给我指点一下…

查看全部问答>

sql ce 中 建立数据库时 怎么使字段的名字为中文啊

create table han(id int) 如何使id 对应的字段名为中文啊 …

查看全部问答>

问一个关于编译的问题。如何在VxWorks下编译出MAP文件?

在PSOS下,编译后会生成一个MAP文件,作为内存的映射表,可以通过它查看正在运行的程序中的某个变量的值。 请问,在VxWorks下,能否编译出这样一个文件?我用的是Tornado2.0。 谢谢各位大侠了。…

查看全部问答>

问香水城,STM32的I2C可不可直接挂5V器件。

香水城,最近一个仪表的案子选用了STM32F101VBT6芯片,遇到一些问题。1.STM32的I2C可不可直接挂5V器件,要求工作在400K?2.外部高频和低频晶体不串390欧电阻、并接1M电阻可以可靠工作吗?3.BOOT0、BOOT1脚一定要先接10K电阻,再接电源或地吗? ...…

查看全部问答>

sx1212驱动程序

请问大家有没有sx1212的驱动程序啊。。。自己英文不好,不知道怎么写。。寻求帮忙啊。。。急啊…

查看全部问答>

XILINX ISE 14.6 Failed to create temporary project!!

打开ISE,先是弹出一个“Project Open Failed”的对话框,关闭它然后点新建工程就会出现“Failed to create temporary project”,并且又弹出一个对话框之后ISE直接就关闭了。C:\\Users\\DAI\\Desktop…

查看全部问答>