既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
//编码器模式设置--------------------------------------------------------------
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//计数模式3
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 10;//滤波器值
TIM_ICInit(TIM3, &TIM_ICInitStructure);
//溢出中断设置--------------------------------------------------------------
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许TIM3溢出中断
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//Reset counter-----------------------------------------------
TIM_SetCounter(TIM3,0); //TIM3->CNT=0
TIM_Cmd(TIM3, ENABLE);
}
(2)在中断服务函数中进行圈数计算
int circle_count=0;//全局变量-圈数
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
if((TIM3->CR1>>4 & 0x01)0) //DIR0
circle_count++;
else if((TIM3->CR1>>4 & 0x01)1)//DIR1
circle_count–;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
(3)获取当前角度值
int Encoder=0;
extern int circle_count;
Encoder=TIM_GetCounter(TIM3)+3600*circle_count;//当前角度
* 上述代码在stm32f407平台测试通过
* 使用另一个配置为捕获模式的定时器测量两个编码器事件之间的周期,可获得**动态信息**(速度、加速度和减速度)。
### 三、update 2023/7/7
* 有网友想要完整代码,我从19年的上古工程中找了找,这是我们当初 robomaster 比赛时摩擦轮测速的代码,时间太久了我也看不太懂,请大家自行参考
1. **编码器初始化**
```
//摩擦轮编码器(右)
void TIM2\_Encoder\_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC\_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC\_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO\_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2);
GPIO\_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO\_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 60000;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM\_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM\_EncoderInterfaceConfig(TIM2,
TIM_EncoderMode_TI1,
TIM_ICPolarity_Falling,
TIM_ICPolarity_Falling);
TIM\_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 10;
TIM\_ICInit(TIM2, &TIM_ICInitStructure);
TIM\_ClearFlag(TIM2, TIM_FLAG_Update);
TIM\_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM2->CNT = 30000;
TIM\_Cmd(TIM2, ENABLE);
}
//摩擦轮编码器(左)
void TIM8\_Encoder\_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC\_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);
RCC\_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
GPIO\_PinAFConfig(GPIOI,GPIO_PinSource5,GPIO_AF_TIM8);
GPIO\_PinAFConfig(GPIOI,GPIO_PinSource6,GPIO_AF_TIM8);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6; //GPIOB0,GPIOB1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO\_Init(GPIOI,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 60000;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM\_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM\_EncoderInterfaceConfig(TIM8,
TIM_EncoderMode_TI1,
TIM_ICPolarity_Falling,
TIM_ICPolarity_Falling);
TIM\_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 10;
TIM\_ICInit(TIM8, &TIM_ICInitStructure);
TIM\_ClearFlag(TIM8, TIM_FLAG_Update);
TIM\_ITConfig(TIM8, TIM_IT_Update, ENABLE);
TIM8->CNT = 30000;
TIM\_Cmd(TIM8, ENABLE);
}
//编码器采集定时器
void TIM6\_Init(u16 prd,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC\_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
TIM_TimeBaseInitStructure.TIM_Period = prd; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM\_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);
NVIC_InitStructure.NVIC_IRQChannel=TIM6_DAC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x03; //抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC\_Init(&NVIC_InitStructure);
TIM\_ITConfig(TIM6,TIM_IT_Update,ENABLE);
TIM\_Cmd(TIM6,ENABLE);
}
```
2. **中断服务函数**
```
//编码器信息
//编号0对应左边的电机,1对应右边电机
//逆时针转计数增加
uint16\_t encoder_data[2];
uint16\_t encoder_data_last[2]={30000,30000};
int16\_t fric_spd[2];
int16\_t spd_last[2]={0,0};
//编码器信息采集
void TIM6\_DAC\_IRQHandler(void)
{
// static int i=0;
if(TIM\_GetITStatus(TIM6,TIM_IT_Update)==SET) //溢出中断
{
// if(i==100)//0.1s
// ANO\_Send\_UserData(RC\_CtrlData.mouse.x,0,0,0);
// else if(i==200)
// ANO\_Send\_UserData(RC\_CtrlData.mouse.x,1,0,0),i=0;
// i++;
//LED1=!LED1;//DS1翻转
encoder_data[0]=TIM8->CNT;
encoder_data[1]=TIM2->CNT;
for(int i=0;i<2;i++)
{
fric_spd[i]=encoder_data[i]-encoder_data_last[i];
//从0到60000的跳变
if(fric_spd[i]>30000)
{
fric_spd[i]-=60000;
}
//从60000到0的跳变
else if(fric_spd[i]<-30000)
{
fric_spd[i]+=60000;
}
if(fric_spd[i]>700||fric_spd[i]<-700)
fric_spd[i]=spd_last[i];
else
spd_last[i]=fric_spd[i];
encoder_data_last[i]=encoder_data[i];
}
ClientFrame.boolSet[0]=fabs(fric_spd[0])>70 ? 1:0;
ClientFrame.boolSet[1]=fabs(fric_spd[1])>70 ? 1:0;
if(ClientFrame.boolSet[0] && ClientFrame.boolSet[1])
shooterEnable=1;
else
shooterEnable=0;
}
TIM\_ClearITPendingBit(TIM6,TIM_IT_Update); //清除中断标志位
}
![img](https://img-blog.csdnimg.cn/img_convert/16a7830859b9ce3a51adea9613cddf45.png)
![img](https://img-blog.csdnimg.cn/img_convert/8fc5441b3b08ed9c2b9c346be5a500d3.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
*既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**