既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter =0;
TIM_ICInit(TIM4,&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter=0;
TIM_ICInit(TIM4,&TIM_ICInitStructure);
TIM\_EncoderInterfaceConfig(TIM4,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising );
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0x02;
NVIC_Init(&NVIC_InitStructure);
TIM\_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM\_Cmd(TIM4,ENABLE);
}
最难配置的已经告诉大家了
最重要的是这个函数TIM\_EncoderInterfaceConfig(TIM4,TIM\_EncoderMode\_TI12,TIM\_ICPolarity\_Rising,TIM\_ICPolarity\_Rising );
配置的编码器模式,具体模式为TIM\_EncoderMode\_TI12
其它timer.h里代码如下
void TIM5_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC\_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=arr;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM\_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
TIM\_ITConfig(TIM5,TIM_IT_Update,ENABLE);
TIM\_Cmd(TIM5,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC\_Init(&NVIC_InitStructure);
}
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
{
Encoder_Timer_Overflow++;
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
u32 Read_Encoder(void)
{
u32 Count;
u16 Current_Count;
u16 Enc_Timer_Overflow_one;
Enc_Timer_Overflow_one=Encoder_Timer_Overflow;
Current_Count = TIM_GetCounter(TIM4);
Encoder_Timer_Overflow=0;
if((TIM4->CR1&0x0010) == 0x0010)
Count = (u32)((-1*Enc_Timer_Overflow_one)*(4*ENCODER_PPR-4) + (Current_Count - Previous_Count));
else
Count = (u32)(Current_Count - Previous_Count + (Enc_Timer_Overflow_one) * (4*ENCODER_PPR-4));
Previous_Count = Current_Count;
return(Count);
}
这里面
if((TIM4->CR1&0x0010) == 0x0010)
Count = (u32)((-1*Enc\_Timer\_Overflow\_one)*(4\*ENCODER\_PPR-4) + (Current\_Count - Previous\_Count));
else
Count = (u32)(Current\_Count - Previous\_Count + (Enc\_Timer\_Overflow\_one) \* (4乘以ENCODER\_PPR-4));
用来得到脉冲的数量并通过DIR位来判断给不给脉冲数量加正负号
主函数代码如下
main.c
#include "sys.h"
#include “delay.h”
#include “usart.h”
#include “led.h”
#include “key.h”
#include “timer.h”
#include “pwm.h”
#include “gpio.h”
#include “math.h”
#include “stdio.h”
#include “control.h”
int encode;
float speed,t;
extern int Encoder_Timer_Overflow;
u8 key;
int duty=50;
void keyscan(void);
int main(void)
{
delay\_init(168);
uart\_init(115200);
KEY\_Init();
\_GPIO\_Init();
NVIC\_PriorityGroupConfig(NVIC_PriorityGroup_2);
TIM13\_PWM\_Init(8400-1,0); // 84mhz->10khz
TIM\_SetCompare1(TIM13,(int)(8400\*(duty/100.0)));
Encoder\_Init\_TIM4((ENCODER_PPR-1)\*4,1-1);
TIM5\_Int\_Init(500-1,8400-1);
while(1)
{
keyscan();
delay\_ms(200);
}
}
void keyscan(void)
{
key=KEY_Scan(0);
if(key)
{
switch(key)
{
case WKUP_PRES:
GPIO_ToggleBits(GPIOF,GPIO_Pin_6);
GPIO_ToggleBits(GPIOF,GPIO_Pin_4);
break;
case KEY0_PRES:
duty+=5;
if(duty>100)duty=0;
TIM\_SetCompare1(TIM13,8400\*(duty/100.0));
break;
}
}
}
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
涵盖了95%以上物联网嵌入式知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)