完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题如题,原本是使用计时器输入捕获功能获取脉冲数的问题,后将代码修改如下使其仅仅只是计数输出一下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! |
|
相关推荐
1个回答
|
|
根据您的描述,您想要实现一个从0到10000的计数循环,并在循环结束后继续执行。首先,我们需要确保您的代码中有一个while循环来实现这个功能。以下是一个简单的示例代码,您可以根据自己的需求进行修改:
```c #include int main(void) { u16 i = 0; LED_Init(); // LED端口初始化 uart_init(115200); // 初始化串口 while (i < 10000) { printf("%dn", i); i++; } // 在这里添加循环结束后要执行的代码 printf("循环结束,继续执行。n"); return 0; } ``` 在这个示例中,我们首先初始化LED和串口,然后使用一个while循环来打印从0到10000的数字。当i等于10000时,循环结束。在循环结束后,您可以在while循环之外添加任何需要执行的代码。 如果您遇到循环结束后跳转至循环前的问题,请检查您的代码中是否有任何条件语句(如if语句)或循环控制语句(如break或continue)可能导致这种情况发生。确保这些语句的逻辑正确,以避免意外的跳转。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1792 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1626 浏览 1 评论
1094 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
732 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1682 浏览 2 评论
1943浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
742浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
577浏览 3评论
600浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
563浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 14:56 , Processed in 0.889603 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号