【STM32】使用单片机DAC产生噪声群

简介: 【STM32】使用单片机DAC产生噪声群

前期准备

软件平台:基于KEIL的HAL库开发

硬件平台:正点原子STM32F4探索者开发板

STM32F4 DAC 简介

STM32F4 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。DAC

可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,

数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。

在双 DAC 模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个

通道的输出。DAC 可以通过引脚输入参考电压 Vref+(通 ADC 共用)以获得更精确的转换

结果。

STM32F4 的 DAC 模块主要特点有:

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

② 8 位或者 12 位单调输出

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

④ 同步更新功能

⑤ 噪声波形生成

⑥ 三角波形生成

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

⑧ 每个通道都有 DMA 功能

图中 VDDA 和 VSSA 为 DAC 模块模拟部分的供电,而 Vref+则是 DAC 模块的参考电

压。DAC_OUTx 就是 DAC 的输出通道了(对应 PA4 或者 PA5 引脚)。

相关寄存器

代码配置

DAC配置

void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{      
    GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_DAC_CLK_ENABLE();             //使能DAC时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();     //开启GPIOA时钟
  
    GPIO_Initure.Pin=GPIO_PIN_5 | GPIO_PIN_4;            //PA5
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
DAC_HandleTypeDef DAC_Handler;//DAC句柄
//初始化DAC
void DAC1_Init(void)
{
    DAC_ChannelConfTypeDef DAC_Config;
    DAC_Handler.Instance=DAC;
    
    DAC_Config.DAC_Trigger=DAC_TRIGGER_T5_TRGO; //使能触发功能TEN1寄存器 另外还需要一个定时器才能产生噪声波 这里选择TIM5触发
//    DACCH2_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;//DAC1输出缓冲关闭,开启这个寄存器电压无法达到0V
  
    HAL_DAC_Init(&DAC_Handler);
    HAL_DAC_ConfigChannel(&DAC_Handler,&DAC_Config,DAC_CHANNEL_2);//配置通道2输出
    
    DAC_Config.DAC_Trigger=DAC_TRIGGER_T7_TRGO; //使能触发功能TEN1寄存器 另外还需要一个定时器才能产生噪声波 这里选择TIM7触发
//    DACCH2_Config.DAC_OutputBuffer=DAC_OUTPUTBUFFER_DISABLE;//DAC1输出缓冲关闭,开启这个寄存器电压无法达到0V
    HAL_DAC_ConfigChannel(&DAC_Handler,&DAC_Config,DAC_CHANNEL_1);//配置为通道2输出
    
     
    HAL_DACEx_NoiseWaveGenerate(&DAC_Handler,DAC_CHANNEL_2,DAC_LFSRUNMASK_BITS11_0 ); // 屏蔽、幅值设置。DAC_LFSRUnmask_BitsX_0处的取值越大,则噪声的幅值越大
    HAL_DACEx_NoiseWaveGenerate(&DAC_Handler,DAC_CHANNEL_1,DAC_LFSRUNMASK_BITS11_0 ); // 
    HAL_DAC_Start(&DAC_Handler,DAC_CHANNEL_2);  //开启DAC通道2
    HAL_DAC_Start(&DAC_Handler,DAC_CHANNEL_1);  //开启DAC通道1
    HAL_DACEx_DualSetValue(&DAC_Handler,DAC_ALIGN_12B_R,0,0);
}

定时器配置:这里可以通过调节定时器自动重装载值和分频系数调整频率大小

TIM_HandleTypeDef TIM5_Handler;      //定时器句柄 
void TIM5_Init(void)
{  
  TIM_MasterConfigTypeDef TIM5_Master;
  
  // 配置配置arr寄存器和psc寄存器可以调整频率可以自己测试
  
    TIM5_Handler.Instance=TIM5;                          //定时器5
    TIM5_Handler.Init.Prescaler=1;                     //分频系数
    TIM5_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM5_Handler.Init.Period=1;                        //自动装载值
    TIM5_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
  
    HAL_TIM_Base_Init(&TIM5_Handler);
    // 设置TIME输出触发为更新模式
    TIM5_Master.MasterOutputTrigger = TIM_TRGO_UPDATE; 
    TIM5_Master.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&TIM5_Handler,&TIM5_Master);
    HAL_TIM_Base_Start(&TIM5_Handler);
}
TIM_HandleTypeDef TIM7_Handler;      //定时器句柄 
void TIM7_Init(void)
{  
  
  TIM_MasterConfigTypeDef TIM7_Master;
  
  // 配置配置arr寄存器和psc寄存器可以调整频率可以自己测试
  
    TIM7_Handler.Instance=TIM7;                          //定时器7
    TIM7_Handler.Init.Prescaler=1;                     //分频系数
    TIM7_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM7_Handler.Init.Period=1;                        //自动装载值
    TIM7_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
  
    HAL_TIM_Base_Init(&TIM7_Handler);
    // 设置TIME输出触发为更新模式
    TIM7_Master.MasterOutputTrigger = TIM_TRGO_UPDATE; 
    TIM7_Master.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&TIM7_Handler,&TIM7_Master);
    HAL_TIM_Base_Start(&TIM7_Handler);
}
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM5)
  {
    __HAL_RCC_TIM5_CLK_ENABLE();            //使能TIM5时钟
  }
    if(htim->Instance==TIM7)
  {
    __HAL_RCC_TIM7_CLK_ENABLE();            //使能TIM7时钟
  }
}

main函数实时打印电压值

int main(void)
{
  float tempV;
  uint32_t tempInt;
    float tempV1;
  
  HAL_Init();                     //初始化HAL库    
  uart_init(115200);
  DAC1_Init();                    //初始化DAC1
  TIM5_Init();
    TIM7_Init();
  
  while(1)
  {
    tempInt= HAL_DAC_GetValue(&DAC_Handler,DAC_CHANNEL_2);
    tempV=(float)tempInt*(3.3/4096);      //得到DAC电压值
        
        tempInt= HAL_DAC_GetValue(&DAC_Handler,DAC_CHANNEL_1);
    tempV1=(float)tempInt*(3.3/4096);     //得到DAC电压值
        
    printf("ch1 = %.3f  ch2 = %.3f\r\n",tempV,tempV1);
    HAL_Delay(100);
  }
}

这里也可以通过示波器测PA4和PA5引脚的输出波形。

最终效果


相关文章
|
7月前
|
传感器 编解码 数据处理
毕业设计|基于STM32单片机的水位浑浊度检测设计
毕业设计|基于STM32单片机的水位浑浊度检测设计
877 0
|
7月前
|
传感器 物联网 芯片
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
141 0
|
7月前
|
芯片
毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计
毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计
|
2月前
|
传感器 监控 JavaScript
千套单片机\stm32毕设课设题目及资料案列-干货分享
为帮助电子工程领域的学习者顺利毕业或掌握更多专业知识,我们精心整理了一系列单片机和STM32相关的题目及资料案例。这些资源覆盖了从毕业设计到课程设计的各个方面,包括但不限于智能小车、温度控制系统、无线通信、智能家居等多个领域。每项设计都配有详细的原理图、仿真图以及完整的文档资料,旨在帮助学生深入理解理论知识的同时,提高实际动手操作能力。无论是初学者还是有一定基础的学生,都能从中找到适合自己的项目进行实践探索。
292 8
|
6月前
|
Web App开发 传感器 Linux
【嵌入式软件工程师面经】STM32单片机
【嵌入式软件工程师面经】STM32单片机
163 1
|
7月前
|
人工智能 安全 搜索推荐
单片机毕业设计|基于stm32智能快递箱设计
随在当今的社会,网上购物以及线下获取快递己经成为日常生活中很重要的一个组成部分,电子商务的发展也带来了快递业的繁荣。这对快递业而言,是一个巨大的发展机遇,同时也是一个不可忽视的挑战。当前,快件运输的安全性越来越受到大家的重视,对快件的服务要求也越来越高。但就目前的快递行业来说,也面临着这样那样的问题,比较经常遇到送快递的到了,业务不在家,取快递时间对不上等。在此基础上,提出了一种以STM32为核心的智能化快递柜。本快递柜的主要功能有,指纹解锁功能,按键功能,警报功能,继电器柜门开锁功能,验证码功能,主要设计加入了指纹解锁功能。本系统以STM32F103为主控芯片,配置了指纹传感、4*4矩阵键盘
245 0
|
7月前
|
缓存 编译器 程序员
嵌入式开发环境Vscode开发STM32单片机程序
嵌入式开发环境Vscode开发STM32单片机程序
180 0
|
7月前
|
人工智能 安全 搜索推荐
单片机毕业设计|基于stm32智能快递箱设计
单片机毕业设计|基于stm32智能快递箱设计
146 0