中级会员
 
- 积分
- 250
- 金钱
- 250
- 注册时间
- 2020-3-3
- 在线时间
- 85 小时
|
//定时器8的编码器模式的配置,引脚PC6-A相 PC7-B相
#define TIM8_Encoder_Line_Number 200//编码器线数,一圈多少个脉冲
u32 TIM8_Count,TIM8_Circle_Count,TIM8_Encoder_Line_Multiple=2;//总计数、圈数计数、脉冲倍频系数(一圈脉冲数=TIM3_Encoder_Line_Number*TIM3_Encoder_Line_Multiple)
//TIM8 CH1 CH2通道用来进行输入捕获 脉冲计数 调节占空比 (数码管显示通道和占空比)
void TIM8_Cap_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM8_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8|RCC_APB2Periph_GPIOC, ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//KEY_Init();
//通道一的配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_6); // A通道先设置为高电平
//通道二的配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_7); //B通道先设置为高电平
//初始化定时器8 TIM8
TIM_TimeBaseStructure.TIM_Period=TIM8_Encoder_Line_Number*TIM8_Encoder_Line_Multiple-1;
TIM_TimeBaseStructure.TIM_Prescaler=0;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
//TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//溢出多少次后进入中断
TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);
TIM_ICStructInit(&TIM8_ICInitStructure);
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_DeInit(TIM8);
TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
TIM_ICStructInit(&TIM8_ICInitStructure);
TIM8_ICInitStructure.TIM_ICFilter=6;
TIM_ICInit(TIM8,&TIM8_ICInitStructure);
NVIC_InitStructure.NVIC_IRQChannel=TIM8_UP_IRQn; //TIM8溢出中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
TIM_ClearFlag(TIM8,TIM_FLAG_Update);
// TIM_ITConfig(TIM8,TIM_IT_CC1|TIM_IT_CC2,ENABLE);
TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE);
TIM8->CNT=0;
TIM_Cmd(TIM8,ENABLE); //使能定时器8
}
//读取编码器的值的函数
u32 TIM8_Get_Encode(void)
{
return TIM8_Circle_Count*TIM8_Encoder_Line_Number*TIM8_Encoder_Line_Multiple+(TIM8->CNT);//获取编码器当前数值
}
//主函数
int main()
{
//串口2
SystemInit();
delay_init(); //延时函数初始化
uart_init(9600); //串口初始化为9600
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组
//LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
//SMG_Init();
//camer_Init();
//TIM4_PWM_Init(35999,1); //pwm频率为1khz,周期为1ms
//TIM5_Int_Init(1999,35999);
//switch_Init();
//detect_Init();
TIM8_Cap_Init();
//TIM1_Cap_Init(0xffff,71); //定时器的计数频率为1Mhz
ec11_Init();
while(1)
{
u32 CurrentCount=TIM8_Get_Encode();
printf("CurrentCount=%d\r\n",CurrentCount);
}
//这是串口调试打印的值,编码器左旋右旋都为0,示波器又能捕捉到左旋右旋的状态,这是什么情况呢?
串口打印的值
|
|