平衡小车基本外设配置(外设配置、定时器、编码器模式、速度读取、pwm,exti)

本文详细介绍了STM32微控制器中定时器、编码器和PWM的基础配置方法,包括定时器初始化、编码器模式设置、速度读取及PWM输出。通过具体的代码示例,展示了如何使用标准库和HAL库进行外设配置。

基本外设配置

外设配置、定时器、编码器模式、速度读取、pwm,exti

基本外设的程序配置

创建.c文件和.h文件,头文件中注意 #ifndef _xxx

#def _xxx

#endif

配置编码器模式

编码器1——PA0/PA1—TIM2

编码器2——PB6/PB7—TIM4

#标准库 编码器的配置

  //摘自B站天下行走

void Encoder_TIM2_Init(void)

{
   
   

	GPIO_InitTypeDef GPIO_InitStruct;

	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

	TIM_ICInitTypeDef TIM_ICInitStruct;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//初始化GPIO--PA0、PA1

	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 |GPIO_Pin_1;

	GPIO_Init(GPIOA,&GPIO_InitStruct);

	TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);//初始化定时器。

	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;

	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;

	TIM_TimeBaseInitStruct.TIM_Period=65535;

	TIM_TimeBaseInitStruct.TIM_Prescaler=0;

	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);

	TIM_EncoderInterfaceConfig(TIM2,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//配置编码器模式

	TIM_ICStructInit(&TIM_ICInitStruct);//初始化输入捕获

	TIM_ICInitStruct.TIM_ICFilter=10;

	TIM_ICInit(TIM2,&TIM_ICInitStruct);

	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//配
### 基于 STM32F103 的平衡小车 HAL 库 使用教程 #### 初始化项目环境 为了使基于 STM32F103C8T6 平衡小车正常工作,需先设置开发环境并初始化必要的硬件资源。这包括配置时钟树、GPIO 口以及定时器外设。 ```c #include "stm32f1xx_hal.h" // 定义全局变量用于存储传感器数据其他控制参数 float gyro_x, gyro_y, gyro_z; float acc_x, acc_y, acc_z; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); // 配置系统时钟 MX_GPIO_Init(); // GPIO端口初始化 while (1){ // 主循环逻辑处理... } } ``` #### 控制电机转动 通过 PWM 波形驱动直流电机实现速度调节功能。这里采用 TIM3 来生成两路互补型PWM信号给H桥电路供电源开关管使用[^1]。 ```c TIM_HandleTypeDef htim3; void MX_TIM3_Init(void){ __HAL_RCC_TIM3_CLK_ENABLE(); htim3.Instance = TIM3; htim3.Init.Prescaler = 79; /* 设置预分频系数 */ htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 999; /* 自动重装载值 */ htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if(HAL_TIM_PWM_Init(&htim3)!= HAL_OK){ Error_Handler(); } TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 499; /* 初始占空比50% */ sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim3,&sConfigOC,TIM_CHANNEL_1); } void Motor_Control(float duty_cycle){ uint32_t pulse_width = (uint32_t)(duty_cycle * 1000); __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,pulse_width); } ``` #### 获取编码器反馈信息 利用外部中断捕捉轮轴旋转产生的脉冲序列计算当前行驶距离与瞬时速率。此处选用 EXTI 中断线配合上升沿触发方式完成计数操作。 ```c volatile int encoder_count=0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin==ENCODER_A_PIN){ encoder_count++; }else if(GPIO_Pin==ENCODER_B_PIN){ encoder_count--; } } void Encoder_Init(){ GPIO_InitTypeDef GPIO_InitStruct={}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = ENCODER_A_PIN | ENCODER_B_PIN ; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(ENCODER_PORT,&GPIO_InitStruct); HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); } ``` #### MPU6050 数据采集 借助 I2C 总线读取惯性测量单元(Inertial Measurement Unit, IMU)内部加速度陀螺仪输出数值作为姿态估计依据之一。 ```c #define WHO_AM_I_REG 0x75 #define ACCEL_XOUT_H 0x3B #define TEMP_OUT_H 0x41 #define GYRO_XOUT_H 0x43 I2C_HandleTypeDef hi2c1; void MPU6050_Read_Registers(uint8_t reg_addr,uint8_t* buffer,int length){ HAL_StatusTypeDef status; status = HAL_I2C_Master_Transmit(&hi2c1,MPU6050_ADDRESS<<1,&reg_addr,1,100); if(status != HAL_OK)return ; status = HAL_I2C_Master_Receive(&hi2c1,MPU6050_ADDRESS<<1,buffer,length,100); } void Get_MPU_Data(){ uint8_t data[14]; MPU6050_Read_Registers(ACCEL_XOUT_H,data,sizeof(data)); acc_x=((int16_t)data[0]<<8)|data[1]; acc_y=((int16_t)data[2]<<8)|data[3]; acc_z=((int16_t)data[4]<<8)|data[5]; temp=((int16_t)data[6]<<8)|data[7]; gyro_x=((int16_t)data[8]<<8)|data[9]; gyro_y=((int16_t)data[10]<<8)|data[11]; gyro_z=((int16_t)data[12]<<8)|data[13]; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值