历史上的今天
今天是: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’可以复位三角波的生成。


注意:
为了产生三角波,必须使能 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引脚上自动输出了。通过示波器就能看到这两个引脚上的波形了。
史海拾趣
|
经过多次优化,得到比较精简的程序。 可以用Proteus仿真,硬件上也可用 编译器:ICC-AVR v6.31A 目标芯片 : M16 时钟: 8.0000Mhz 下面是AVR与LCD连接信息 PA2 ->RS PA3 ->EN 地 ->RW PA4 ->D4 PA5 ->D5 ...… 查看全部问答> |
|
转自:电子元件技术 发光二极管(LED)继在中小尺寸屏幕的便携产品背光等应用获大量采用后,随着它发光性能的进一步提升及成本的优化,近年来已迈入通用照明领域,如建筑物照明、街道照明、景观照明、标识牌、信号灯、以及住宅内的照明等,应用可谓 ...… 查看全部问答> |
|
$(\'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 带来了新方法,帮 ...… 查看全部问答> |
|
比如: #include main() { sbit p11=P1^1; p11=0; } 编译时出现错误; 有些用80X51.h; 头文件 ...… 查看全部问答> |
|
一个键盘过滤驱动支持动态卸载: // 原作者 : 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 ...… 查看全部问答> |




