STM32
直播中

旧念

9年用户 833经验值
擅长:可编程逻辑 电源/新能源 光电显示
私信 关注
[问答]

如何使用STM32输出一路PWM波形?

如何使用STM32输出一路PWM波形?

回帖(1)

段朝思

2021-11-19 09:26:53
输出一路PWM波形




  • PWM输出模式
    PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存器 ARR 的值决定,占空比由比较寄存器 CCR 的值决定。PWM 模式分为两种,PWM1 和 PWM2,总得来说是差不多。
  • 硬件设计
    这里使用的是野火STM32指南者开发板,根据引脚定义,示波器探头输入可以接开发板的PA8和PB13两个引脚,任选其一即可。
  • 软件设计
    这里我们使用野火自带的PWM输出波形工程文件
    main.c


int main(void)
{       
        /* 定时器初始化 */
        ADVANCE_TIM_Init();
       
  while(1)
  {      
  }
}
相关代码

static void ADVANCE_TIM_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;


  // 输出比较通道
        RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);


  // 输出互补通道
        RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1N_GPIO_CLK, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1N_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(ADVANCE_TIM_CH1N_PORT, &GPIO_InitStructure);
  
        // 默认输出低电平
        GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);       
}



  • 结果





输出周期为2kHz的正炫波形

可以利用 STM32 的 DAC 配合 TIM 定时器,可以输出随时间变化的电压         


  • 硬件
    指南者开发板DAC输出通道为PA4和PA5,所以我们可以使用这两个引脚来观测输出波形



  • 软件

  a.输出周期计算
在实际中,我们可以通过工程里的正弦波点数和定时器配置生成特定频率的正弦波,这里我们需要输出一个周期为2kHz的正弦波,通过计算公式,我们可以得到,一共需要3600个采样点
  这里我们可以利用Matlab进行采样点的获取。
取点脚本:

%用于产生正弦数据表,输出到文件dac_sinWave.c 文件中,复制到c语言数组即可


n = 2*pi/3600 : 2*pi/3600 : 2*pi      %分成3600等份


a = sin(n)+1;                     %求取sin函数值并向上平移一个单位,消除负数值
a = a * 3.3/2;                    %调整幅值,使范围限制为0~3.3   
r = a* (2.^12) /3.3               %求取dac数值,12位dac LSB = 3.3/2.^12
r = uint16(r);                     %把double型数据转化成16位整型数据


for i = 1:32                        
if r(i) > 4095                      %限制数据最大不超过4095
    r(i) = 4095
end
end


dlmwrite('dac_sinWave.c',r);      %把数据写入到文件,方便添加到stm32工程中
plot(n,r,'.')                     %把这些点画出来



  • 代码
    我们使用野火自带的DAC输出代码,然后进行细微修





    进入工程后,我们需要找到存放数据的数组,将我们之前取到的3600个采样点,放进去





    main.c


int main(void)
{
                        /*DAC初始化*/
         while(1)
                {       
                        DAC_Mode_Init();


}
            
}
void DAC_Mode_Init(void)
{
        uint32_t Idx = 0;  


        DAC_Config();
        DAC_TIM_Config();       
       
        /*填充正弦波波形*/
  for (Idx = 0; Idx < POINT_NUM; Idx++)
  {
    DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
  }
       
        DAC_DMA_Config();
}



  • 结果





数字音频转换为模拟音频




  • 准备一段音频文件,截取几秒钟,输出wav文件




  • 文本









举报

更多回帖

发帖
×
20
完善资料,
赚取积分