问题如题,原本是使用计时器输入捕获功能获取脉冲数的问题,后将代码修改如下使其仅仅只是计数输出一下0至10000的数字:
int main(void) { u16 i = 0, j; LED_Init(); //LED端口初始化 uart_init(115200); printf("%drn", 70000); //串口输出程序启动标志 while(1) { printf("%drn", i++); if(i >= 10000) break; } LED0 = 0; printf("%d, %drn", i, j); }在上位机中根据输出数字显示波形,其波形如下:
在跳出while循环后其会跳转至循环前继续执行两次,最终在第三次正常结束。
本人才疏学浅,初次遇到这种情况,真诚求助orz!
以下为原问题,目前来看可以暂时排除计时器的原因。
问题如题,电机的AB相分别连接
tiM3的通道1和通道2,主函数代码如下:
/************************************************ 通过输入捕获获取有刷直流电机的脉冲数************************************************/ int main(void) { u16 i = 0, j; LED_Init(); uart_init(115200); TIM3_Encoder_Init(65535, 0); printf("%d, %drn", 70000, 0); //串口输出程序启动标志 while(i < 10000) //i为累计检测到的脉冲数,如果累计检测到了10000个脉冲就结束循环 { j = getEncoder(); //getEncoder()返回本次循环的脉冲数,返回后会将CNT置零 printf("%d, %drn", i, j); //向串口1输出 累计的脉冲数 和 本次循环获取的脉冲数 if(j < 100) i += j; //排除可能存在的错误值后将脉冲数累计 } LED0 = 0; printf("%d, %drn", i, j); }同时使用上位机观察串口输出的波形,理论上输出累积至10000以上就会结束,可实际输出波形如下:
经多次测试,在累计脉冲数第一次和第二次接近循环判断值时程序会重启并重新计数,至第三次才会正常的结束这个计数过程。
输入捕获部分代码如下:
//arr:自动重装值,测试中使用65535//psc:时钟预分频数,测试中使用0void TIM3_Encoder_Init(u16 arr,u16 psc){ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_ResetBits(GPIOA, GPIO_Pin_6 | GPIO_Pin_7); TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); TIM_ICStructInit( TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICFilter = 0x0A; TIM_ICInit(TIM3, TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM3, TIM_ICInitStructure); TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_Cmd(TIM3, ENABLE);}//获取当前脉冲数,获取后置0u16 getEncoder(){ u16 temp; temp = TIM_GetCounter(TIM3); TIM_SetCounter(TIM3, 0); return temp;}本人纯纯清澈愚蠢大学生一枚,真诚求助orz!