【问题标题】:Square wave generation with STM32 and timer使用 STM32 和定时器生成方波
【发布时间】:2017-09-06 18:41:10
【问题描述】:

我正在尝试生成方波/正交信号(2 个方波,偏移 90 度)。该板是STM32F103C8 我还没有专注于频率,我只想有一个干净的正交信号。 我的代码目前并不复杂,这里有 2 个主函数来初始化定时器:

void init_SW()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    // Step 1: Initialize GPIO as input for rotary encoder
    // PB7 (TIM4_CH2) (encoder pin A), PB6 (TIM4_CH1) (encoder pin B)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);
    // Step 2: Setup TIM4 for encoder input

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_TimeBaseStructInit (&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Period = 3;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_Cmd(TIM4, ENABLE);
        TIM_TimeBaseInit (TIM4, &TIM_TimeBaseStructure);
/*  
  TIM4->CCR3=0 ;
        TIM4->CCR4=(TIM4->ARR+1)/2;
        TIM4->CCER;
        */
}

和:

void timer_ccr_init (void)
{
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  /* always initialise local variables before use */
  TIM_OCStructInit (&TIM_OCInitStructure);

  /* Common settings for all channels */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

  /* Channel1 */
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OC1Init (TIM4, &TIM_OCInitStructure);

  /* Channel2 - 90 degres after*/
  TIM_OCInitStructure.TIM_Pulse = 1;
  TIM_OC2Init (TIM4, &TIM_OCInitStructure);
    TIM4->CCER;
}

你知道我在哪里搞砸了吗?

【问题讨论】:

    标签: timer signals stm32


    【解决方案1】:

    我对 F1 线或标准外设库不太熟悉,但我认为这是错误的

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    

    要将定时器输出信号连接到实际引脚,您最好将它们设置为交替功能模式。

    这行放错地方了:

    TIM_Cmd(TIM4, ENABLE);
    

    在设置完所有通道后启用计时器。因为您没有使用预分频器,而且周期很短,所以一个通道可能会执行几个周期,而您仍在设置另一个通道。但是,如果您同时启用通道,这将没有问题(这在寄存器级别是可能的,但 STL 可能无法做到),但是

    TIM4->CCER;
    

    单独一行没有任何效果(读取寄存器并丢弃值)。您实际上应该在此寄存器中设置一些位以启用某些通道。

    /* Channel2 - 90 degres after*/
    TIM_OCInitStructure.TIM_Pulse = 1;
    

    因为周期是 4 个周期(0 到 3),所以会产生 45 度的偏移。通道 1 在周期 0 中切换,通道 2 在周期 1 中切换,在周期 2 和 3 中没有任何反应。

    【讨论】:

    • 我进行了以下更改,但我的信号仍然令人作呕。我尝试了 GPIO_Mode_AF_OD 和 GPIO_Mode_AF_PP 但没有任何变化pastebin.com/Y64tqzQM 我不知道为什么我的信号现在这么乱。
    • GPIO 速度(输出驱动强度)设置为GPIO_Speed_2MHz。使用程序中的参数,输出频率为 FAPB1/4/2。如果大于 2MHz,那么信号就会失真。你仍然没有降低你的 APB1 频率,但如果它是 36 MHz 之类的最大值,你会得到 4.5MHz
    • 如果您需要如此高的频率输出,请使用GPIO_Speed_10MHzGPIO_Speed_50MHz 以获得清晰的信号。
    • 好的。 APB1 我设置为 36Mhz,APB2 设置为 72。这是我的最后一个代码:pastebin.com/REFzj0EA,这是我的 oscillo 给我的:hpics.li/2a5cee9
    • 您使用什么仪器来探测信号以及它是如何连接的?您是否有可以证明您可以成功探测并显示 4.5MHz 信号的参考信号源?
    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多