江科大stm32学习笔记——【5-2】对射式红外传感器计次&旋转编码计次

一.对射式红外传感器计次

1.原理

 

2.硬件连接

3.程序

CountSensor.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

uint16_t CountSensor_Count;

void CountSensor_Init(void)
{
	//配置RCC时钟:
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//EXTI和NVIC时钟一直是打开的
	
	//配置GPIO,端口为输入模式:
	GPIO_InitTypeDef GPIO_InitStruture;
	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,可参考手册建议选择
	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruture);
	
	//配置AFIO,选择用上一步的GPIO,连接到后面的EXTI:
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//配置AFIO的数据选择器
	//将PB14号引脚的电平信号通过AFIO进入到EXTI
	
	//配置EXTI(选择边沿触发方式,选择触发响应方式):
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
	EXTI_Init(&EXTI_InitStructure);
	
	//配置NVIC(选择优先级):
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//2 bits for pre-emption priority,2 bits for subpriority
	//pre-emption抢占优先级 subpriority响应优先级
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
}

uint16_t CountSensor_Get(void)
{
	return CountSensor_Count;
}

void EXTI15_10_IRQHandler(void)//中断函数
{
	if(EXTI_GetITStatus(EXTI_Line14)==SET)//进行中断标志位的判断
	{
		Delay_ms(300);//消抖
		//开始中断函数:
		CountSensor_Count ++;
		EXTI_ClearITPendingBit(EXTI_Line14);//将中断标志位清除,以防无限中断
	}
}

CountSensor.h:

#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H

void CountSensor_Init(void);
uint16_t CountSensor_Get(void);

#endif

main.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"


int main(void)
{
	OLED_Init();
	CountSensor_Init();
	
	OLED_ShowString(1,1,"Count:");//显示字符串
	
	while(1)
	{
		OLED_ShowNum(1,7,CountSensor_Get(),5);
	}
}

二.旋转编码计次

1.硬件连接

2.程序

Encoder.c:

#include "stm32f10x.h"                  // Device header

int16_t Encoder_Count;

void Encoder_Init(void)
{
	//配置RCC时钟:
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//EXTI和NVIC时钟一直是打开的
	
	//配置GPIO,端口为输入模式:
	GPIO_InitTypeDef GPIO_InitStruture;
	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,可参考手册建议选择
	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruture);
	
	//配置AFIO,选择用上一步的GPIO,连接到后面的EXTI:
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//配置AFIO的数据选择器
	//将PB0号引脚的电平信号通过AFIO进入到EXTI
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//配置AFIO的数据选择器
	//将PB1号引脚的电平信号通过AFIO进入到EXTI
	
	//配置EXTI(选择边沿触发方式,选择触发响应方式):
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
	EXTI_Init(&EXTI_InitStructure);
	
	//配置NVIC(选择优先级):
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//2 bits for pre-emption priority,2 bits for subpriority
	//pre-emption抢占优先级 subpriority响应优先级
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_Init(&NVIC_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructure);

}

int16_t Encoder_Get(void)
{
	int16_t Temp;
	Temp = Encoder_Count;
	Encoder_Count = 0;
	return Temp;
}

void EXTI0_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line0) == SET)
	{
		//防止抖动
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0)
		{
			if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)//是的话就是反转
			{
				Encoder_Count --;
			}
		}
		EXTI_ClearITPendingBit(EXTI_Line0);
	}
}

void EXTI1_IRQHandler(void)
{
	if(EXTI_GetITStatus(EXTI_Line1) == SET)
	{
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
	    {
			if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0) == 0)//是的话就是反转
			{
				Encoder_Count ++;
			}
	    }
		EXTI_ClearITPendingBit(EXTI_Line1);
	}
}

 Encoder.h:

#ifndef __ENCODER_H
#define __ENCODER_H
void Encoder_Init(void);
int16_t Encoder_Get(void);
#endif

main.c:

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"

int16_t Num;

int main(void)
{
	OLED_Init();
	Encoder_Init();
	
	OLED_ShowString(1,1,"Num:");//显示字符串
	
	while(1)
	{
		Num += Encoder_Get();
		OLED_ShowSignedNum(1,5,Num,5);
	}
}

四.调试

出现了两个问题:

1.旋转无反应,调试发现因为有的面包板中间不相连,所以要用跳线相连。

2.旋转太慢时记不上数,最后在中断代码那里加了一个if语句防抖

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
科大STM32笔记是关于STM32单片机学习笔记,其中涵盖了一些关于按键初始化和按键读取的代码示例。在这些代码中,通过引用中的Key_Init函数来对按键进行初始化,然后通过引用中的Key_GetNum函数来获取按键按下的键码值。代码中使用了STM32的GPIO模块来配置引脚的工作模和读取引脚的电平状态。此外,引用中提到STM32内部集成了硬件收发电路,可以通过写入控制寄存器CR和数据寄存器DR来实现与外设的通信,并通过读取状态寄存器SR来了解外设电路的当前状态。这些寄存器的使用可以实现对外设的控制和监测,减轻CPU的负担。因此,科大STM32笔记主要是介绍了STM32单片机的相关知识和编程技巧。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32学习笔记 -- I2C(科大)](https://blog.csdn.net/weixin_61244109/article/details/131002266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [STM32科大学习笔记](https://blog.csdn.net/weixin_38647099/article/details/128337708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值