新手入门
- 积分
- 19
- 金钱
- 19
- 注册时间
- 2022-3-22
- 在线时间
- 5 小时
|
发表于 2022-4-2 10:33:49
|
显示全部楼层
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "timer.h"
extern TIM_HandleTypeDef TIM_HandleType;
extern uint32_t gPeriod;
uint32_t cnt,b=0;
int main(void)
{
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(336,8,2,7); //设置时钟,168Mhz
delay_init(168); //初始化延时函数
Encoder_Init(); //所以定时器3的频率为84M/8400=10K,自动重装载为5000-1,那么定时器周期就是500ms
while(1)
{
HAL_Delay(300);
cnt = __HAL_TIM_GET_COUNTER(&TIM_HandleType); //读取计数器中的值,即编码器走过的线数
b=(TIM3->CR1&0X0010)>>4; //读取CR1寄存器中DIR位的值,判断正传还是反转
}
}
#include "timer.h"
#include "led.h"
TIM_HandleTypeDef TIM_HandleType;
TIM_Encoder_InitTypeDef TIM_Encoder_InitType;
uint32_t gPeriod = (2500*4)-1;
int c=0;
void Encoder_Init()
{
TIM_HandleType.Instance=TIM3;
TIM_HandleType.Init.CounterMode =TIM_COUNTERMODE_DOWN;
TIM_HandleType.Init.ClockDivision =TIM_CLOCKDIVISION_DIV1; //定时器时基单元的配置中该功能是配置ETR外部触发时钟分频的
TIM_HandleType.Init.Period=gPeriod; //计数器的装载值,即编码器转一圈的最大线数值,若采用上升下降都计数,则该值为线数*4-1;
TIM_HandleType.Init.Prescaler=0; //编码器模式下,计数器分频数为0即可
TIM_HandleType.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;//高级定时器时才使用自动重装载功能
TIM_Encoder_InitType.EncoderMode = TIM_ENCODERMODE_TI12; //为了提高精度,一般采用上升和下降沿都计数
TIM_Encoder_InitType.IC1Polarity = TIM_ICPOLARITY_RISING; //通道一的捕获极性不反相
TIM_Encoder_InitType.IC1Selection = TIM_ICSELECTION_DIRECTTI;//通道一的信号直接映射到IC1上
TIM_Encoder_InitType.IC1Prescaler = TIM_ICPSC_DIV1; //通道一信号不分频,即发生一次就捕获一次
TIM_Encoder_InitType.IC1Filter = 0; //输入捕获模式中,通道的采样频率和数字滤波器长度根据CKD[1:0]位来设置,一般不设置分频
TIM_Encoder_InitType.IC2Polarity = TIM_ICPOLARITY_RISING;
TIM_Encoder_InitType.IC2Selection = TIM_ICSELECTION_DIRECTTI;
TIM_Encoder_InitType.IC2Prescaler = TIM_ICPSC_DIV1;
TIM_Encoder_InitType.IC2Filter = 0;
HAL_TIM_Encoder_Init(&TIM_HandleType, &TIM_Encoder_InitType);
HAL_TIM_Encoder_Start(&TIM_HandleType, TIM_CHANNEL_ALL);
}
void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_InitStruct ;
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
}
纯属自己理解写的,如果有什么不对的地方感谢批评指正。 |
|