完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
做项目时碰到的一个小问题,由于思路错误小小的困扰了一会
电机运行测试 我是今年毕业的,所以在公司里负责的东西也比较简单,这次是做一个电机的运行测试板,用来测试电机和驱动模块的好坏。测试的电机主要是步进电机和直流减速电机。在步进电机测试模块十分顺利,但是在直流减速电机测试的时候碰到了一点小问题。 测试的直流减速电机都是自带编码器的,所以要同时测试编码器的好坏,编码器正常工作时会反馈两路脉冲,MCU同时检测到两路脉冲持续一段时间后,作出反应(让指示灯和蜂鸣器响)表示正常工作。于是我第一时间想到的是STM32的输入捕获功能,因为以前都只做过一路,没有做过两路同时捕获,所以查找了一下相关资料。 但是当程序写好后发现并不起作用,想了半天,后来发现不需要这么麻烦,因为我不需要测量脉冲的频率,只需要知道是否一直有脉冲信号就行了,所以直接用外部中断来判断就好,因为脉冲频率也不高,只有10KHZ,所以从一开始就陷入了一个误区,把简单问题复杂化了。 部分代码 外部中断配置函数 void FeedBack_Config() { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//启用GPIO口和复用功能时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择外部中断源 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource2); //中断分级 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; NVIC_Init(&NVIC_InitStructure); //外部中断初始化 EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line2; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } 外部中断函数的内容,判断有多少个脉冲,到达一定的数量开启指示灯和蜂鸣器 void EXTI0_IRQHandler() { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { temp_ch1++; EXTI_ClearITPendingBit(EXTI_Line0); } if(((temp_ch1>=1000)&&(temp_ch1<5000))&&((temp_ch2>=1000)&&(temp_ch2<5000))) { LED(1); BEEP(1); } else if((temp_ch1>=5000)&&(temp_ch2>=5000)) { temp_ch1 = 0; temp_ch2 = 0; LED(0); BEEP(0); } } void EXTI2_IRQHandler() { if(EXTI_GetITStatus(EXTI_Line2) != RESET) { temp_ch2++; EXTI_ClearITPendingBit(EXTI_Line2); } } |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2481 浏览 0 评论
3341 浏览 9 评论
3022 浏览 16 评论
3514 浏览 1 评论
9119 浏览 16 评论
1243浏览 3评论
636浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
627浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2374浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1937浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-24 22:46 , Processed in 1.024097 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号