历史上的今天
返回首页

历史上的今天

今天是:2024年12月30日(星期一)

正在发生

2021年12月30日 | STM32F103使用DAC功能输出三角波

2021-12-30 来源:eefocus

在DAC的主要特征中可以看出,DAC内部还带有波形发生器。


DAC 主要特征


2个DAC转换器:每个转换器对应1个输出通道

8位或者12位单调输出

12位模式下数据左对齐或者右对齐

同步更新功能

噪声波形生成

三角波形生成

双DAC通道同时或者分别转换

每个通道都有DMA功能

外部触发转换

输入参考电压V REF+


比如我们要输出一个三角波,就不需要自己去计算三角波每个点的电压是多少,通过内部自带的三角波发生器,就可以产生三角波。具体的操作步骤在官方文档中也有介绍。


三角波生成


可以在DC或者缓慢变化的信号上加上一个小幅度的三角波。设置WAVEx[1:0]位为’10’选择DAC的三角波生成功能。设置DAC_CR寄存器的MAMPx[3:0]位来选择三角波的幅度。内部的三角波计数器每次触发事件之后3个APB1时钟周期后累加1。计数器的值与DAC_DHRx寄存器的数值相加并丢弃溢出位后写入DAC_DORx寄存器。在传入DAC_DORx寄存器的数值小于MAMP[3:0]位定义的最大幅度时,三角波计数器逐步累加。一旦达到设置的最大幅度,则计数器开始递减,达到0后再开始累加,周而复始。将WAVEx[1:0]位置’0’可以复位三角波的生成。

image.png?imageView2/2/w/550
image.png?imageView2/2/w/550

注意:


为了产生三角波,必须使能 DAC 触发,即设 DAC_CR 寄存器的 TENx 位为 ’1’ 。

MAMP[3:0] 位必须在使能 DAC 之前设置,否则其值不能修改

下面通过代码来设置DAC输出三角波


#include "dac_wave.h"


//通过DAC通道1和通道2输出三角波

void DAC_Wave_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    DAC_InitTypeDef            DAC_InitStructure;

    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;

  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

    TIM_TimeBaseStructure.TIM_Period = 0x0F;

    TIM_TimeBaseStructure.TIM_Prescaler = 0x01;

    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);


    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;

    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;

    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;

    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

    DAC_Init(DAC_Channel_1, &DAC_InitStructure);


    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_2047;

    DAC_Init(DAC_Channel_2, &DAC_InitStructure);


    DAC_Cmd(DAC_Channel_1, ENABLE);

    DAC_Cmd(DAC_Channel_2, ENABLE);


    DAC_SetDualChannelData(DAC_Align_12b_R, 0, 0);


    TIM_Cmd(TIM2, ENABLE);

}

将DAC的通道1和通道2都开启,要自动输出三角波,这时候就不能使用软件自己去触发了,在这里要借助定时器来自动触发,当定时器定时时间到了之后,就会触发一次DAC的输出,这里使用的是定时器2触发,所以初始化DAC的时候。也要初始化定时器2,接下里初始化DAC,设置DAC的触发方式为定时器2触发,然后选择三角波发生器,接下来设置通道1三角波的幅度最大值为4095。也就是输出的三角波最大电压值为3.3V。设置通道2的三角波最大幅值为2047,也就是通道2的最大值为通道1的一半1.65V。最后使能DAC输出。这是三角波就会的PA4和PA5引脚上自动输出了。通过示波器就能看到这两个引脚上的波形了。


推荐阅读

史海拾趣

對餘科技(DIOFIT)公司的发展小趣事

随着科技的不断发展,DIOFIT公司始终将技术创新作为发展的核心驱动力。他们不断投入研发资金,引进先进技术和人才,致力于研发具有自主知识产权的电子产品。在物联网、人工智能等前沿领域,DIOFIT公司取得了一系列突破性的成果,推出了一系列具有竞争力的产品,成为行业内的技术创新引领者。

品赞(G-Switch)公司的发展小趣事
在排除故障后,对保护电路进行测试,确保其能够正常响应电源断相故障。
AAC [American Accurate Components]公司的发展小趣事

进入21世纪,AAC公司继续加大市场拓展力度。2003年,AAC成功拓展了台湾市场,与明基、仁宝电脑和华宇电脑等知名企业建立了合作关系。为了满足这些客户对高品质耳机的需求,AAC开始生产制造耳机产品。这一创新举措不仅丰富了AAC的产品线,也进一步提升了其在电子消费产品市场的竞争力。

Delus Corp公司的发展小趣事

为了降低生产成本、提高生产效率,Delus Corp公司不断优化供应链管理。公司建立了完善的供应链管理系统,实现了从原材料采购、生产制造到产品销售的全程监控和管理。同时,公司还与供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。这些措施的实施,使得公司的运营成本得到了有效降低,生产效率得到了显著提升。

DC Components公司的发展小趣事

在电子行业中,产品质量是企业立足之本。DC Components公司深知这一点,因此始终把质量控制放在首位。公司通过实施严格的质量控制系统,确保每一个产品都符合高质量标准,并符合所有合同要求。这种对质量的坚守,使DC Components公司在市场上赢得了良好的口碑,吸引了众多客户的青睐。

Euroquartz公司的发展小趣事

Euroquartz在技术创新方面始终保持领先地位。公司推出的新款超薄MEMS滤波器系列产品,就是其技术实力的最好体现。这些滤波器在制造过程中,对互调失真及相位和振幅匹配等特性进行了优化,提供了从音频到3GHz的宽泛可选频率范围,最大功率可达200W。这些创新产品不仅满足了市场的需求,也进一步巩固了Euroquartz在电子元器件行业的领先地位。

问答坊 | AI 解惑

[共享]发一个LCD1602驱动程序(四位数据线)

经过多次优化,得到比较精简的程序。 可以用Proteus仿真,硬件上也可用 编译器:ICC-AVR v6.31A   目标芯片 : M16 时钟: 8.0000Mhz 下面是AVR与LCD连接信息 PA2 ->RS PA3 ->EN 地  ->RW PA4 ->D4 PA5 ->D5 ...…

查看全部问答>

分享:LED照明设计基础知识

转自:电子元件技术 发光二极管(LED)继在中小尺寸屏幕的便携产品背光等应用获大量采用后,随着它发光性能的进一步提升及成本的优化,近年来已迈入通用照明领域,如建筑物照明、街道照明、景观照明、标识牌、信号灯、以及住宅内的照明等,应用可谓 ...…

查看全部问答>

单片机视频教程【4-2】数码管

$(\'swf_Rx2\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/30389179/v.swf\'), ...…

查看全部问答>

新批准的 ZigBee Health Care 标准现可供公众下载

面向能源管理、住宅、商业和消费电子应用产品创造无线解决方案的全球企业联盟 ZigBee(R) 联盟 (ZigBee(R) Alliance) 今天宣布,董事会已经批准 ZigBee Health Care(ZigBee 医疗保健标准),并向公众发布标准。ZigBee Health Care 带来了新方法,帮 ...…

查看全部问答>

CAN总线原理与应用

CAN总线原理与应用…

查看全部问答>

请问KEIL C51 的IO口怎么定义?

比如:     #include     main()     {      sbit  p11=P1^1;      p11=0;     }     编译时出现错误; 有些用80X51.h; 头文件 ...…

查看全部问答>

usb 不能正确的识别

我的usb 不能被电脑识别,且电源的灯也不闪,不知道为什么,请高手们帮忙解决,谢谢…

查看全部问答>

关于动态卸载键盘过滤驱动

一个键盘过滤驱动支持动态卸载: // 原作者 : sinister VOID KeyDriverUnload( PDRIVER_OBJECT KeyDriver ) { PDEVICE_OBJECT KeyFilterDevice ;      PDEVICE_OBJECT KeyDevice ; PDEVICE_EXTENSION KeyExtension; P ...…

查看全部问答>

急,重开一帖,讨论wince是否能支持512M内存问题?????

重开一帖方便大家讨论,我用的是s3c6410,arm11的核,可以支持2Gbit即512M内存,以前是128M的,完全可以使用,现在改成512M(没办法,要做移动pc之类的东西。。。),使用两个bank: bank0: 0x50000000 - 0x60000000 bank1: 0x60000000 - 0x7000000 ...…

查看全部问答>

pppoe上网问题

请问如何实现在CE下PPPOE拨号上网 我在PB下添加的PPPOE特征 在CE下的网络设置那可以看到PPPOE的连接 但是不能拨号成功 更别说拨号上网了。 请问各位如何才能成功用PPPOE拨号上网 希望大家提出宝贵意见!!谢谢 我的联系方式: QQ:50224041 ...…

查看全部问答>