#include<stm32f10x.h> #include"sys.h" extern unsigned char Rec_Dat_U1; extern unsigned char Rec_String_U1[200]; extern int conut_flag_1; #define in_1(x) x?GPIO_ResetBits(GPIOC , GPIO_Pin_0): GPIO_SetBits(GPIOC , GPIO_Pin_0) #define in_2(x) x?GPIO_ResetBits(GPIOC , GPIO_Pin_1): GPIO_SetBits(GPIOC , GPIO_Pin_1) #define in_3(x) x?GPIO_ResetBits(GPIOB , GPIO_Pin_10): GPIO_SetBits(GPIOB , GPIO_Pin_10) #define in_4(x) x?GPIO_ResetBits(GPIOB , GPIO_Pin_11): GPIO_SetBits(GPIOB , GPIO_Pin_11) #define key_1 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12) #define key_2 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13) #define key_3 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14) #define key_4 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15) float Kp_l = 0.82 ; //比例常数 float Ti_l = 0.09 ; //微分时间常数 float Td_l = 0.015 ; //采样周期 float Kp_r = 0.20 ; float Ti_r = 0.09 ; float Td_r = 0.015 ; #define T 0.02 #define Ki_l Kp_l*(T/Ti_l) // Kp Ki Kd #define Kd_l Kp_l*(Td_l/T) #define Ki_r Kp_l*(T/Ti_l) // Kp Ki Kd #define Kd_r Kp_l*(Td_l/T) #define left_b in_1(1); in_2(0); #define left_f in_1(0); in_2(1); #define right_f in_3(1); in_4(0); #define right_b in_1(0); in_2(1); extern float pwm_l; extern float pwm_r; void CAR_GPIO_INIT(void); int main() { // int speed=50; SYS_CONFIG(); CAR_GPIO_INIT(); pwm_init(TIM3_1); pwm_init(TIM3_2); TIM4_PWMINPUT_INIT(0xffff,31); //1M速度采样率 TIM5_PWMINPUT_INIT(0xffff,31); incPIDinit(); PID_set(Kp_l,Ki_l,Kd_l,Kp_r,Ki_r,Kd_r); //void PID_set(float pp_1,float ii_1,float dd_1,float pp_2,float ii_2,float dd_2) right_f left_f // set_pwm_percent(TIM3_1,50) ; // set_pwm_percent(TIM3_2,50) ; PID_setpoint(&PID_l, 160); PID_setpoint(&PID_r, 160); while(1) { printf("%d\r\n",(int)pwm_l); delay_ms(200); } } void CAR_GPIO_INIT() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); }
时间: 2025-06-17 17:07:41 浏览: 18
这段代码展示了基于STM32F10x系列单片机的小车控制程序的一部分。它通过初始化GPIO端口,并设置了一些用于控制电机和读取按键状态的宏定义,还包含了一个简单的主循环,在其中调用了PID控制器的相关函数。
### 主要功能分析
#### 引入头文件及外部变量声明
```c
#include <stm32f10x.h>
#include "sys.h"
extern unsigned char Rec_Dat_U1;
extern unsigned char Rec_String_U1[200];
extern int count_flag_1;
```
这部分引入了必要的库以及一些全局使用的外部变量。
#### 宏定义 - 控制信号生成与状态检测
```c
#define in_1(x) x ? GPIO_ResetBits(GPIOC, GPIO_Pin_0) : GPIO_SetBits(GPIOC, GPIO_Pin_0)
...
#define key_4 GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)
```
这些`#define`语句简化了对特定IO管脚的操作命令,比如驱动马达的方向、停止等动作;同时也能方便地获取按钮的状态信息。
#### PID 参数配置
```c
float Kp_l = 0.82; // 左侧轮子的比例系数
float Ti_l = 0.09; // 积分时间常数
float Td_l = 0.015;
float Kp_r = 0.20; // 右侧轮子的比例系数
float Ti_r = 0.09;
float Td_r = 0.015;
#define T 0.02
#define Ki_l Kp_l * (T / Ti_l)
#define Kd_l Kp_l * (Td_l / T)
#define Ki_r Kp_r * (T / Ti_r)
#define Kd_r Kp_r * (Td_r / T)
```
这里设置了左右两侧轮子对应的PID调节器的比例(P),积分(I),微分(D)三个关键参数值,之后又根据给定的时间间隔\( T \),计算出了实际应用中的Ki和Kd数值。
#### 初始化外设并启动任务
接下来的部分主要是对外部设备进行初始化工作,包括PWM模块、定时器以及其他硬件资源:
- `SYS_CONFIG();`: 系统基本配置;
- `CAR_GPIO_INIT();`: 配置所有需要用到的GPIO引脚;
- 对两个通道分别进行了PWM初始化(`TIM3_1`, `TIM3_2`) 和 PWM 输入模式 (`TIM4`, `TIM5`);
- 调用自定义函数完成PID算法的初始设定:`incPIDinit()` -> 增量式PID初始化;
- 设定了左侧和右侧目标转速为160rpm左右(假设单位是RPM),即 `PID_setpoint(&PID_l, 160)` 和 `PID_setpoint(&PID_r, 160)`。
最后进入死循环不断打印当前左轮的速度百分比,并每隔一段时间延时一次。
### 关键点解析
- **I/O 操作** : 使用了大量的宏定义来简化 I/O 的操作过程。
- **PID 控制** : 根据预先设定好的比例、积分及时刻调整规则来进行速度闭环反馈控制。
- **系统架构设计合理化**: 分离式的编码风格使得每个部分职责明确易于维护更新。
阅读全文
相关推荐

















