[单片机芯片] 【沁恒CH32V307开发板测评】DAC性能测试

[复制链接]
2103|0
星享社 发表于 2025-8-20 08:08 | 显示全部楼层 |阅读模式
本帖最后由 星享社 于 2025-8-29 15:57 编辑

上一篇介绍了ADC,今天这一篇来介绍一下DAC,与ADC是逆向操作,也就是将数字信号转为模拟信号。
一、DAC是什么
一句话总结:​​ ​​DAC 就像一位语言大师,负责把电脑、手机里冷冰冰的「数字密码」音乐文件,翻译成喇叭、耳机能听懂并播放出来的「真实声音」信号。​​
想象你收藏的音乐文件(MP3, FLAC, WAV 等)是一本写满「0」和「1」的密码书。这本书虽然记载了音乐的所有信息,但它不是真实的「声音」。
  • 数字世界:​​ 你的手机、电脑、音乐播放器(称为「​​数字音源​​」)只懂得处理和储存这本「密码书」(​​数字信号​​)。
  • 模拟世界:​​ 你的耳机、音箱、放大器(称为「​​模拟设备​​」)只懂得处理连续、自然的「波形」(​​模拟信号​​),这样才能推动空气发出我们听到的声音。
二、CH32V307的DAC特点
CH32V307的DAC主要有以下特点
1、2 个 DAC 转换器,每个转换器对应 1 个输出通道;也就是只有两个通道的DAC输出引脚
2、三角波、噪声波形发生器
3、可配置 8 位或 12 位输出
4、12 位数据左对齐或右对齐
5、双 DAC 同时或分别转换
6、支持 DMA 功能
7、 多种触发事件
框图如下:
1755647943716.jpg
三、DAC实测验证
1、新建工程
2、DAC初始化
  1. void Dac_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure = {0};
  4.     DAC_InitTypeDef  DAC_InitType = {0};
  5.     //使能相应时钟
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  7.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

  8.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;
  9.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  10.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  11.     DAC_InitType.DAC_Trigger = DAC_Trigger_None;
  12.     DAC_InitType.DAC_WaveGeneration = DAC_WaveGeneration_None;
  13.     DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
  14.     DAC_InitType.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  15.     DAC_Init(DAC_Channel_1, &DAC_InitType);
  16.     DAC_Cmd(DAC_Channel_1, ENABLE);//使能DAC

  17.     DAC_SetChannel1Data(DAC_Align_12b_R, 0);
  18. }
3、设置循环输出几个电压值
  1.     u16 DACValue[CNT] = {64, 128, 256, 512, 1024, 2048, 4095};
  2.    
  3.      for(uint8_t i = 0; i < CNT; i++)
  4.     {
  5.         DAC_SetChannel1Data(DAC_Align_12b_R, DACValue[i]);
  6.         Delay_Ms(10000);
  7.     }
4、实际验证

一共八组DAC的值
理论值分别为:0.051、0.103、0.206、0.4125、0.825、1.65、3.29
实际测量值如下:0.053、0.104、0.208、0.411、0.820、1.64、3.27
DACValue[0]
0.jpg
DACValue[1]
1.jpg
DACValue[2]
2.jpg
DACValue[3]
3.jpg
DACValue[4]
4.jpg
DACValue[5]
5.jpg
DACValue[6]
6.jpg
以上7个数据来看,精度比较高,整体上相差2mV左右,有的还相差1mv。
5、输出正弦波测试
1)代码如下:
输出幅值为1.65V的正弦波

  1. uint32_t DAC_Value[Num]={2048,2248,2447,2642,2831,3013,3185,3347,3496,3631,3750,3854,3940,4007,4056,4086,
  2.                          4095,4086,4056,4007,3940,3854,3750,3631,3496,3347,3185,3013,2831,2642,2447,2248,
  3.                          2048,1847,1648,1453,1264,1082,910 ,748 ,599 ,464 ,345 ,241 ,155 ,88  ,39  ,9   ,
  4.                          0   ,9   ,39  ,88  ,155 ,241 ,345 ,464 ,599 ,748 ,910 ,1082,1264,1453,1648,1847};

  5. uint32_t Dual_DAC_Value[Num];


  6. /*********************************************************************
  7. * @fn      Dac_Init
  8. *
  9. * @brief   Initializes DAC collection.
  10. *
  11. * @return  none
  12. */
  13. void Dual_Dac_Init(void)
  14. {
  15.     GPIO_InitTypeDef GPIO_InitStructure={0};
  16.     DAC_InitTypeDef DAC_InitType={0};
  17.    
  18.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
  19.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );
  20.    
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;            
  23.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  24.    
  25.     DAC_InitType.DAC_Trigger=DAC_Trigger_T4_TRGO;
  26.     DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;
  27.     DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
  28.     DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;
  29.     DAC_Init(DAC_Channel_1,&DAC_InitType);
  30.     DAC_Init(DAC_Channel_2,&DAC_InitType);

  31.     DAC_Cmd(DAC_Channel_1, ENABLE);
  32.     DAC_Cmd(DAC_Channel_2, ENABLE);

  33.     DAC_DMACmd(DAC_Channel_1,ENABLE);
  34.     DAC_DMACmd(DAC_Channel_2,ENABLE);

  35.     DAC_SetDualChannelData(DAC_Align_12b_R, 0x123,0x321);
  36. }

  37. /*********************************************************************
  38. * @fn      DAC1_DMA_INIT
  39. *
  40. * @brief   Initializes DMA of DAC1 collection.
  41. *
  42. * @return  none
  43. */
  44. void Dac_Dma_Init(void)
  45. {
  46.     DMA_InitTypeDef DMA_InitStructure={0};
  47.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  48.     DMA_StructInit( &DMA_InitStructure);
  49.     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(DAC->RD12BDHR);
  50.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Dual_DAC_Value[0];
  51.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  52.     DMA_InitStructure.DMA_BufferSize = Num;
  53.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  54.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  55.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  56.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  57.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  58.     DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  59.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  60.     DMA_Init(DMA2_Channel3, &DMA_InitStructure);
  61.     DMA_Cmd(DMA2_Channel3, ENABLE);
  62. }

  63. /*********************************************************************
  64. * @fn      Timer4_Init
  65. *
  66. * @brief   Initializes TIM4
  67. *
  68. * @return  none
  69. */
  70. void Timer4_Init(void)
  71. {
  72.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure={0};
  73.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  74.     TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  75.     TIM_TimeBaseStructure.TIM_Period = 3600-1;
  76.     TIM_TimeBaseStructure.TIM_Prescaler =0;
  77.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  78.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  79.     TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  80.     TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update);
  81.     TIM_Cmd(TIM4, ENABLE);
  82. }
2)下载验证如下:
PA4 通道

微信图片_20250829155302_169_174.jpg
PA5 通道
微信图片_20250829155311_171_174.jpg

整体来说,DAC的精度满足一般场景是没有什么大问题的,另外产生波形也是非常准确的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

30

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部