一、对射红外传感器计数
1.模块简介
共4引脚,其中数字量输出端口D0,模拟量输出端口A0无效。
槽内被遮挡时,输出高电平,指示灯灭。
2.相应代码
初始化
void CountSensor_Init()
{ //GPIOB_Pin15
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO时钟
GPIO_InitTypeDef GPIO_InitSensor; //配置GPIO
GPIO_InitSensor.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitSensor.GPIO_Pin=GPIO_Pin_15;
GPIO_InitSensor.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitSensor);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15); //配置EXIT
EXTI_InitTypeDef EXTI_InitStr;
EXTI_InitStr.EXTI_Line=EXTI_Line15;
EXTI_InitStr.EXTI_LineCmd=ENABLE;
EXTI_InitStr.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStr.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发
EXTI_Init(&EXTI_InitStr);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC
NVIC_InitTypeDef NVIC_InitStr;
NVIC_InitStr.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStr.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStr.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStr.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStr);
}
中断函数
uint16_t CountNum=0;
void EXTI15_10_IRQHandler() //中断程序
{
if(EXTI_GetITStatus(EXTI_Line15)==SET) //判断是不是通道15中断
{
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 0) //消抖
{
CountNum++;
}
EXTI_ClearITPendingBit(EXTI_Line15); //清楚中断标志位
}
}
二、旋转编码器计数
1.模块简介
- 用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向
- 顺时针旋转A通道信号落后90度,逆时针旋转超前90度
2.代码
功能:正反计数
初始化
void REncoder_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO时钟
GPIO_InitTypeDef GPIO_InitStr; //配置GPIO
GPIO_InitStr.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStr.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStr);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
EXTI_InitTypeDef EXTI_InitStr;
EXTI_InitStr.EXTI_Line=EXTI_Line0 | EXTI_Line1;
EXTI_InitStr.EXTI_LineCmd=ENABLE;
EXTI_InitStr.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStr.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStr);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVI
NVIC_InitTypeDef NVIC_InitStr;
NVIC_InitStr.NVIC_IRQChannel=EXTI0_IRQn;
NVIC_InitStr.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStr.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStr.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStr);
NVIC_InitStr.NVIC_IRQChannel=EXTI1_IRQn;
NVIC_InitStr.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStr.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStr.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStr);
}
中断函数
void EXTI0_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line0)==SET)
{
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)
{
REncoder_Count--;
}
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI1_IRQHandler()
{
if(EXTI_GetITStatus(EXTI_Line1)==SET)
{
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0)
{
REncoder_Count++;
}
}
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
功能函数
int16_t REncoder_Get()
{
int16_t Temp;
Temp=REncoder_Count;
REncoder_Count=0;
return Temp;
}