完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
霍尔编码器
想用一个定时器实现测速但是 TIM_Period ARR 过程中要读取cnt并置零 所以要两定时器 可用是stm32的霍尔编码功能;AB项那个上升沿先到判断cnt加减; TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);检查全上升沿 无所谓方向问题实验一下就行了而且无法确认霍尔编码器那个的AB项(我菜我也不明白) void Speed_Init(void) { GPIO_InitTypeDef GPIO_Struct; TIM_TimeBaseInitTypeDef TIM_Base_Struct; TIM_ICInitTypeDef TIM_IC_Struct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); GPIO_Struct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Struct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_Init(GPIOA,&GPIO_Struct); TIM_DeInit(TIM3);//预防 TIM_Base_Struct.TIM_Period = 6000; TIM_Base_Struct.TIM_Prescaler = 0; TIM_Base_Struct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_Base_Struct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_Base_Struct); TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//霍尔编码 TIM_IC_Struct.TIM_ICFilter = 9; TIM_ICInit(TIM3, &TIM_IC_Struct); TIM_Cmd(TIM3, ENABLE); } static void NVIC_Tim6_Init(void) { NVIC_InitTypeDef NVIC_Tim6_Struct; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_Tim6_Struct.NVIC_IRQChannel = TIM6_IRQn; NVIC_Tim6_Struct.NVIC_IRQChannelPreemptionPriority = 1; NVIC_Tim6_Struct.NVIC_IRQChannelSubPriority = 4; NVIC_Tim6_Struct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_Tim6_Struct); } void TIM6_Init(void) { TIM_TimeBaseInitTypeDef TIM_Base_Struct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); TIM_DeInit(TIM6);//预防 TIM_Base_Struct.TIM_Period = 999; TIM_Base_Struct.TIM_Prescaler = 71;//1ms TIM_TimeBaseInit(TIM6, &TIM_Base_Struct); TIM_ClearFlag(TIM6, TIM_FLAG_Update); TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); TIM_Cmd(TIM6, ENABLE); NVIC_Tim6_Init(); } 利用ARR重装可以实现正负的判断极短的时间内计数不可能太高 #include "usart.h" #include "tim_speed.h" #include "delay.h" int count = 0; u16 time = 0; float speed = 0; int main (void) { Speed_Init(); USART_Config(); delay_init(); TIM6_Init(); while(1){ if(time == 500){ count = (short)TIM3 -> CNT; TIM3 -> CNT=0; if(count<5000){ speed = count/1540*3.1415*2*0.03/(time/1000); printf("%5.3frn",speed); }else { speed = (6000-count)/1540*3.1415*2*0.03/(time/1000);//由于电机年代久远搞不清楚减速比自己手动转一圈多次测试大概在1540 printf("-%5.3frn",speed); } time = 0; } } } void TIM6_IRQHandler(void) { if ( TIM_GetITStatus( TIM6, TIM_IT_Update) != RESET ){ time++; TIM_ClearITPendingBit(TIM6 , TIM_FLAG_Update); } } 学习中。。。。。仅作参考。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1606 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1538 浏览 1 评论
969 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
681 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1584 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
642浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
514浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
501浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 03:17 , Processed in 0.730209 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号