[mw_shl_code=c,true]/********************************************************************************
快乐的实验室
*******************************************************************************/
#include "encoder.h"
#define ENCODER1_TIMER TIM3 // Encoder1 unit connected to TIM2 PA0 PA1
#define ENCODER_PPR1 (u16)(1000) // number of pulses per revolution
uint16_t conter1 =0;//vu16表示__IO uint16_t
// //volatile unsigned short Counter1表示vu16
__IO int16_t Encoder_Speed1 =0; //使用了tim4和tim5两个编码器模式,分别为这里耳朵2和1
//vs16表示__IO int16_t
//typedef signed short int int16_t;
//#define __IO volatile /*!< defines 'read / write' permissions */
//volatile signed short Counter2表示vs16
//volatile s16 encoder_num;
// void TIM2_Mode_Config(void)
// {
// TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM3
// TIM_TimeBaseStructure.TIM_Period =5000; //当定时器从0计数到999,即为1000次,为一个定时周期
// TIM_TimeBaseStructure.TIM_Prescaler =7200-1; //设置预分频:
// TIM_TimeBaseStructure.TIM_ClockDivision =0 ; //设置时钟分频系数:不分频
// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
// /*初始化TIM2定时器 */
// TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// /* 使能TIM2中断 */
// TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
// /* 使能TIM2定时器 */
// TIM_Cmd(TIM2, ENABLE);
// }
void TIM3_Mode_Config(void)
{
//u16 CCR1_Val = 2500;
//u16 CCR2_Val = 1000;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;
/*----------------------------------------------------------------*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStructure);
/* Configure PA.06,07 as encoder input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*----------------------------------------------------------------*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3
TIM_DeInit(TIM3);
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period =0xffff; //
TIM_TimeBaseStructure.TIM_Prescaler =0; //设置预分频:
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
//TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
/*初始化TIM2定时器 */
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/*-----------------------------------------------------------------*/
//编码配置 编码模式
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,
TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //TIM_ICPolarity_Rising上升沿捕获
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 6; //比较滤波器
TIM_ICInit(TIM3, &TIM_ICInitStructure);
//TIM_ARRPreloadConfig(TIM3, ENABLE);
// Clear all pending interrupts
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能中断
//Reset counter
TIM3->CNT =0;
TIM_Cmd(TIM3, ENABLE); //使能定时器3
}
void TIM_Init(void)
{
TIM3_Mode_Config();
}
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE);//使能定时器2的时钟
TIM_TimeBaseStructure.TIM_Period=arr;//自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler=psc;//分频值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能定时器2的中断
NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;//响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);//按照配置参数初始化
TIM_Cmd(TIM2,ENABLE);//使能定时器2外设
}
//定时器2的中断响应函数
//每次进入中断服务程序间隔时间为0.1秒
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//检查指定的定时器3中断发生与否
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除定时器3的中断待处理位
conter1 = TIM_GetCounter(TIM3);//获得TIM3的计数器的数值
Encoder_Speed1 = (3*conter1)/20;//-32767;//1500*(Counter1-32767)/ENCODER_PPR1 ;//15*(Counter1-32767)/4;
printf("电机转速%d\r\n",Encoder_Speed1);//串口终端上显示获得的电机转速n,单位为r/min
// PIDSetPoint(MOTER1_PID ,1500);//设定PID目标值,输入参数为转速的目标值
// bike_left_pwm_set(PIDCalc(MOTER1_PID , Encoder_Speed1));//输入参数为计算出的转速,输出为驱动电机转动的PWM
// bike_right_pwm_set(PIDCalc(MOTER1_PID , Encoder_Speed1));
// printf("Counter1 =%d\r\n",TIM_GetCounter(TIM2));//串口终端上显示获得的编码器脉冲数
// printf("Encoder_Speed1 =%d\r\n",(Counter1)/4000);//串口终端上显示获得的电机转速n,单位为r/min
//
// *Counter1)/64);//串口终端上显示获得的电机转速n,单位为r/min
//USART1_SendLine(PIDCalc(MOTER1_PID , Encoder_Speed1),0,1);
////USART1_SendLine(Counter1,0,2);
//
// GPIO_ResetBits(GPIOA,GPIO_Pin_8);
TIM2->CNT = 0;//定时器2的计数值清零
TIM3->CNT =0;
[/mw_shl_code]
[mw_shl_code=c,true]}[/mw_shl_code]
|