STM32F4xxx系列 - DAC生成噪声波

发布时间:2026/7/15 19:03:16

STM32F4xxx系列 - DAC生成噪声波 目标利用定时器5周期为5ms从DAC1通道产生一个噪声波。涉及知识DAC原理、stm32中的DAC、定时器、DAC输出IO配置1. DAC原理DAC是将数字输入转换成模拟输出主要有两种实现方式电阻-电位器网络 通过开关控制不同的电阻分压生成对应的模拟电压。电容-二进制加权 利用电容的充放电特性快速生成模拟信号。2. 二进制加权算法3. STM32F407ZG中的DAC特性有2个12位的DAC模块对应输出引脚为PA4、PA5各2个通道。1、可选择8/12模式向左还是向右对齐2、单通道模式或双通道模式3、触发方式自动触发、定时器触发、外部中断触发3、输出计算方式4. 定时器根据时钟树:1高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11 ----- APB2总线2通用定时器timer2-timer5timer12-timer14以及基本定时器timer6,timer7 ----- APB1总线3当APB1和APB2分频数为1时钟频率原频率4当APB1和APB2分频数不为1时钟频率原频率x2核心计算方式Tout ((arr1)*(psc1))/Tclkarr为预载值psc为分频值Tout为时钟频率本实验使用的tim5挂载在APB1上16位。4. 程序配置4.1DAC配置在DAC.c文件中创建配置函数1、DAC输出IO配置为了避免寄生电流消耗应首先将 PA4 或 PA5 引脚配置为模拟模式 (AIN)。2、DAC转换配置1使能DAC时钟2选择DAC触发方式为timer5触发:CR-TENx 控制位置 1可通过外部事件CR-TSELx[2:0] 决定通过哪一个来触发转换DAC_InitStructure.DAC_TriggerDAC_Trigger_T5_TRGO;3)选择在转换后的信号上加上伪噪声使用 LFSR线性反馈移位寄存器。将 WAVEx[1:0] 置为“01”即可选择生成噪声。DAC_InitStructure.DAC_WaveGenerationDAC_WaveGeneration_Noise;4设置噪声的最大幅值最大就是12位拉满3.3vDAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitudeDAC_LFSRUnmask_Bits11_0;5关闭输出缓冲如果不需要驱动外部6初始化将相应寄存器设置好7使能打开完整代码voidDAC1_Init(void){GPIO_InitTypeDef GPIO_InitStructure;DAC_InitTypeDef DAC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//使能DAC时钟GPIO_InitStructure.GPIO_Pin GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AN;//模拟输入GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;//GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_NOPULL;//浮空GPIO_Init(GPIOA, GPIO_InitStructure);//初始化GPIO_SetBits(GPIOA,GPIO_Pin_4);DAC_InitStructure.DAC_TriggerDAC_Trigger_T5_TRGO;//不使用触发功能 TEN10DAC_InitStructure.DAC_WaveGenerationDAC_WaveGeneration_Noise;//不使用波形发生DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitudeDAC_LFSRUnmask_Bits11_0;//屏蔽、幅值设置DAC_InitStructure.DAC_OutputBufferDAC_OutputBuffer_Disable ;//DAC1输出缓存关闭 BOFF11DAC_Init(DAC_Channel_1,DAC_InitStructure);//初始化DAC通道1DAC_Cmd(DAC_Channel_1, ENABLE);//使能DAC通道1DAC_SetChannel1Data(DAC_Align_12b_R,0);//12位右对齐数据格式设置DAC值}4.2定时器配置1使能时钟2设置装载值arr(不得超过16位无符号)500-13设置分频值psc不得超过16位无符号值8400-14计数方式向上计数5初始化6打开使能完整代码voidTim5_Init(uint16_tarr,uint16_tpsc){TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);TIM_TimeBaseInitStructure.TIM_Period arr;TIM_TimeBaseInitStructure.TIM_Prescaler psc;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;TIM_TimeBaseInit(TIM5, TIM_TimeBaseInitStructure);TIM_Cmd(TIM5, ENABLE);}4.3定时器触发定时器的框图中有一个TRGO信号输出此信号可以用来触发ADC、DAC、其他定时器等。TIM_SelectOutputTrigger这个函数TIMx_CR2寄存器的位6到位4赋值位6到位4是MMS[2:0]完整代码voidTIM5_TriggerInit(void){// 定时器TIMx初始化// TIM5_Int_Init 函数已经设置好了主模式定时器TIMx的周期arr// TIMx触发其他模块的功能设置// TIM_SelectMasterSlaveMode(TIM5, TIM_MasterSlaveMode_Enable); // 设置定时器的主从模式// 设置定时器5为主模式TIM_SelectOutputTrigger(TIM5, TIM_TRGOSource_Update);//设置TIME输出触发为更新模式}实验1bits11_0实验2bits5_0

相关新闻