我正在尝试生成方波/正交信号(2个方波,偏移90度)。该板是STM32F103C8 我还没有专注于频率,我只想要一个干净的正交信号。 我的代码目前并不复杂,为了初始化计时器,这里有两个主要功能:
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;
}
你知道我搞砸了哪里?
答案 0 :(得分: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中没有任何反应。