Commit 9520ebf2 by 刘大爷来也

提交电机驱动

parent 7f5eea5b
This source diff could not be displayed because it is too large. You can view the blob instead.
#ifndef BUZZER_H
#define BUZZER_H
void Buzzer_On(void);
void Buzzer_Off(void);
#endif
#ifndef COMMON_H
#define COMMON_H
#include "stm32f10x.h"
#define D14_GET() (((GPIOD->IDR >> 14) & 1) ? 1 : 0)
// 定义系统状态的枚举类型
typedef enum {
STATE_IDLE, // 系统处于空闲状态
STATE_MOTOR_RUNNING, // 电机正在运行
STATE_EMERGENCY_STOP, // 紧急停止状态
STATE_BACKUP_RADAR_ACTIVE, // 备用雷达激活状态
STATE_PARKING_SENSOR_ACTIVE, //倒车雷达激活状态
STATE_DISTANCE_SWITCH_ACTIVE,// 距离开关激活状态
STATE_PHOTOELECTRIC_SWITCH_ACTIVE // 光电开关激活状态
} SystemState;
// 状态处理函数
void StateMachineHandler(SystemState newState);
void Delay(uint32_t time, char unit);
void Total_GPIO_Init(void);
void Total_EXTI_Init(void);
#endif // COMMON
#ifndef DISTANCE_SWITCH_H
#define DISTANCE_SWITCH_H
void Distance_Switch_Interruption(void);
#endif // DISTANCE_SWITCH
#ifndef DS18B20_H
#define DS18B20_H
#include "stm32f10x.h"
// 引脚定义
#define DS18B20_DQ_PIN (1 << 12) // PD12
#define DS18B20_PORT GPIOD
// 设置 DQ 引脚为输出模式
#define DQ_OUT() { \
GPIOD->CRH &= ~(0xF << (4 * 4)); /* 清除配置 */ \
GPIOD->CRH |= (0x3 << (4 * 4)); /* 设置为推挽输出模式,最大50MHz */ \
}
// 设置 DQ 引脚为输入模式
#define DQ_IN() { \
GPIOD->CRH &= ~(0xF << (4 * 4)); /* 清除配置 */ \
GPIOD->CRH |= (0x4 << (4 * 4)); /* 设置为浮空输入模式 */ \
}
// 获取 DQ 引脚的电平变化
#define DQ_GET() ((GPIOD->IDR & DS18B20_DQ_PIN) ? 1 : 0)
// DQ 输出高电平或低电平
#define DQ(x) ((x) ? (GPIOD->BSRR = DS18B20_DQ_PIN) : (GPIOD->BRR = DS18B20_DQ_PIN))
uint8_t DS18B20_Check(void);
char DS18B20_Init(void);
void DS18B20_Start(void);
float DS18B20_GetTemperture(void);
#endif // DS18B20_H
#ifndef EMERGENCY_STOP_H
#define EMERGENCY_STOP_H
void Emergency_Stop_Interrupt(void);
#endif // EMERGENCY_STOP
#ifndef MOTOR_COMMON_H
#define MOTOR_COMMON_H
#define SYSCLK_FREQUENCY 72000000 // 主时钟频率(72 MHz)
#define STEPMOTOR_ANGLEPERSTEP 1.8 //步进电机步距角
#define STEPMOTOR_FREDIV 32 //步进电机分频系数(细分数)
#define STEPMOTOR_PERDISTANCE 2 //步进电机一转走2mm
#define STEPMOTOR_PULSEPERROUND ((360/STEPMOTOR_ANGLEPERSTEP)*STEPMOTOR_FREDIV) //步进电机每转所需要脉冲的脉冲个数
#define STEPMOTOR_PULSEPERDISTANCE STEPMOTOR_PULSEPERROUND/STEPMOTOR_PERDISTANCE //步进电机每1mm所需要脉冲的脉冲个数
#define STEPMOTOR_FREQ_ROUNDPERMIN (9375/(STEPMOTOR_FREDIV*2)) //步进电机1r/min需要配置的定时器重载值((72000000*60/STEPMOTOR_PULSEPERROUND)/72)(假设时钟分频为8) 定时时间=60s/(每转需要的脉冲个数) 秒冲个数*2是因为只认高-低
#define STEPMOTOR_MAX_SPEED(psc, arr) (SYSCLK_FREQUENCY / ((psc + 1) * (arr + 1)) * 60 / STEPMOTOR_PULSEPERROUND)
#include "stdint.h"
#include <stdbool.h>
typedef enum {
SPEED_NONE, // 匀速
SPEED_ACC, // 加速
SPEED_DEC, // 减速
SPEED_STOP, // 停止
} SpeedStatus;
typedef enum {
ABSOLUTE_COUNT,
RELATIVE_COUNT,
CIRCULAR_COUNT,
BIDIRECTIONAL_COUNT,
INCREMENTAL_COUNT
} StepCountMode;
typedef struct {
uint32_t stepcount; // 步数(脉冲数)
uint8_t direction; // 方向 (0: 逆时针, 1: 顺时针)
uint16_t curSpeed; // 当前速度 (步/秒)
uint16_t desSpeed; // 目标速度 (步/秒)
uint16_t maxSpeed; // 最大转速
SpeedStatus speedStatus; // 速度状态
uint8_t speedlevel; // 速度级别 0:正常、1:快速、2:慢速
StepCountMode stepcountMode; // 脉冲计数模式
uint16_t curlocation; // 当前位置(角度判断)
uint16_t deslocation; // 目标位置
uint16_t acceleration; // 加速度 (步/秒^2)
uint16_t deceleration; // 减速度 (步/秒^2)
uint16_t psc; // 预分频器
uint16_t arr; // 自动重装载寄存器
} Motor;
#endif // MOTOR_COMMON_H
#ifndef ONEWIRE_H
#define ONEWIRE_H
#include "stm32f10x.h"
// 引脚定义
#define ONEWIRE_PIN (1 << 12) // PD12
#define ONEWIRE_PORT GPIOD
// 初始化 One-Wire 总线 (PE1)
void Onewire_Init(void);
// 设置引脚为输出模式
void Onewire_Pin_Output(void);
// 设置引脚为输入模式
void Onewire_Pin_Input(void);
// 复位 One-Wire 总线并检测传感器是否存在
uint8_t Onewire_Reset(void);
// 向 One-Wire 设备发送一位数据
void Onewire_SendBit(unsigned char Bit);
// 从 One-Wire 设备接收一位数据
unsigned char Onewire_ReceiveBit(void);
// 向 One-Wire 设备发送一个字节数据
void Onewire_SendByte(unsigned char Byte);
// 从 One-Wire 设备接收一个字节数据
unsigned char Onewire_ReceiveByte(void);
#endif // ONEWIRE_H
#ifndef PARKING_SENSOR_H
#define PARKING_SENSOR_H
#include "stm32f10x.h" // 包含STM32F103的寄存器定义头文件
// 全局变量
extern volatile uint32_t pulse_time ; // 脉宽时间
extern volatile double distance_cm ; // 距离
extern volatile uint8_t capture_state ; // 捕获状态标志
// 动态配置 PE0 - PE15 引脚
void Configure_PE_Pin(uint8_t pin, uint8_t mode);
// 初始化 TIM2 为捕获模式
void TIM2_Capture_Init(void);
// 发送触发信号
void SendTriggerSignal(void);
double CalculateDistance();
void Parking_Sensor_Interruption(void);
#endif // parking_sensor
#ifndef PHOTOELECTRIC_SWITCH_H
#define PHOTOELECTRIC_SWITCH_H
void Photoelectric_Switch_Interrupt(void);
#endif // PHOTOELECTRIC_SWITCH
#ifndef PNEUMATIC_SOLENOID_H
#define PNEUMATIC_SOLENOID_H
#include "stdint.h"
//控制气动电磁阀的高低电平
void Pneumatic_Solenoid_Control(uint8_t index,unsigned char bitValue);
//查询气动电磁阀的电平
unsigned char find_Pneumatic_Solenoid(uint8_t index);
#endif // PNEUMATIC_SOLENOID
#ifndef STEPPER_MOTOR_H
#define STEPPER_MOTOR_H
#include "motor_common.h"
#include "stdint.h"
#include <stdbool.h>
typedef struct {
Motor base; // 继承自公共结构体
} RotateMotor;
// 更新电机状态
void Update_Motor_Status(RotateMotor *motor, SpeedStatus status, uint32_t targetSpeed, uint32_t acceleration);
;
void Rotate_SetDirection(int direction);
// 使能或禁用旋转电机
void Rotate_Enable_Rotate(bool enable);
// 设置PWM频率
void Set_PWM_Frequency(uint32_t frequency);
// 梯形加速算法
void RotateMotor_Accelerate(uint32_t targetRPM, uint32_t acceleration);
//梯形减速算法
void RotateMotor_Decelerate(uint32_t currentRPM, uint32_t deceleration);
void TIM3_CH1_Init(uint16_t psc,uint16_t arr);
#endif // STEPPER_MOTOR_H
#ifndef STEPPER_MOTOR_H
#define STEPPER_MOTOR_H
#define SYSCLK_FREQUENCY 72000000 // 主时钟频率(72 MHz)
#define STEPMOTOR_ANGLEPERSTEP 1.8 //步进电机步距角
#define STEPMOTOR_FREDIV 32 //步进电机分频系数(细分数)
#define STEPMOTOR_PERDISTANCE 2 //步进电机一转走2mm
#define STEPMOTOR_PULSEPERROUND ((360/STEPMOTOR_ANGLEPERSTEP)*STEPMOTOR_FREDIV) //步进电机每转所需要脉冲的脉冲个数
#define STEPMOTOR_PULSEPERDISTANCE STEPMOTOR_PULSEPERROUND/STEPMOTOR_PERDISTANCE //步进电机每1mm所需要脉冲的脉冲个数
#define STEPMOTOR_FREQ_ROUNDPERMIN (9375/(STEPMOTOR_FREDIV*2)) //步进电机1r/min需要配置的定时器重载值((72000000*60/STEPMOTOR_PULSEPERROUND)/72)(假设时钟分频为8) 定时时间=60s/(每转需要的脉冲个数) 秒冲个数*2是因为只认高-低
#define STEPMOTOR_MAX_SPEED(psc, arr) (SYSCLK_FREQUENCY / ((psc + 1) * (arr + 1)) * 60 / STEPMOTOR_PULSEPERROUND)
typedef enum
{
SPEED_NONE, // 无速度变化
SPEED_ACC, // 加速
SPEED_DEC, // 减速
SPEED_STOP, // 停止
} SpeedStatus;
// 定义步进电机配置结构体
typedef struct {
unsigned stepcount; // 步数(脉冲数)
unsigned direction; // 方向 (0: 逆时针, 1: 顺时针)
unsigned curSpeed; // 当前速度 (步/秒)
unsigned desSpeed; // 目标速度 (步/秒)
unsigned maxSpeed; //最大转速
SpeedStatus speedStatus; // 速度状态
unsigned stepcountMode; // 脉冲计数模式
unsigned curlocation; // 当前位置
unsigned deslocation; // 目标位置
unsigned acceleration; // 加速度 (步/秒^2)
unsigned deceleration; // 减速度 (步/秒^2)
uint16_t psc; //预分频器
uint16_t arr; //自动重装载寄存器
} StepMotor;
// 更新电机状态
void Update_Motor_Status(StepMotor *motor, SpeedStatus status, uint32_t targetSpeed, uint32_t acceleration);
;
void Set_Direction(int direction);
// 使能或禁用步进电机
void Enable_Stepper(bool enable);
// 设置PWM频率
void Set_PWM_Frequency(uint32_t frequency)
// 梯形加减速算法
void StepMotor(int steps, int direction, int max_speed, int acceleration);
void Delay(uint32_t delay);
void Timer_Frequency(int & frequency,StepMotor *stepMotor);
void TIM3_Init(uint16_t &psc,uint16_t &arr);
#endif // STEPPER_MOTOR_H
\ No newline at end of file
// ds18b20.h
#ifndef TEMPERATURE_SENSOR_H
#define TEMPERATURE_SENSOR_H
void TemperatureSensor_ConvertT(void); // 启动温度转换
float TemperatureSensor_ReadT(void); // 读取温度数据
#endif
#ifndef WALKING_MOTOR_H
#define WALKING_MOTOR_H
#include "motor_common.h"
#include "stdint.h"
#include <stdbool.h>
typedef struct {
Motor base; // 继承自公共结构体
} WalkingMotor;
// 更新电机状态
void Walking_Update_Motor_Status(WalkingMotor *motor, SpeedStatus status, uint32_t targetSpeed, uint32_t acceleration);
;
void Walking_SetDirection(int direction);
// 使能或禁用旋转电机
void Walking_Enable_Rotate(bool enable);
// 设置PWM频率
void Walking_Set_PWM_Frequency(uint32_t frequency);
// 梯形加速算法
void WalkingMotor_Accelerate(uint32_t targetRPM, uint32_t acceleration);
//梯形减速算法
void WalkingMotor_Decelerate(uint32_t currentRPM, uint32_t deceleration);
void TIM3_CH2_Init(uint16_t psc,uint16_t arr);
#endif
#include "buzzer.h"
#include "stm32f10x.h"
#include "common.h"
void Buzzer_On(void) {
GPIOE->BSRR = GPIO_BSRR_BS9; // 设置PE9为高电平
Delay(1, 's');
}
void Buzzer_Off(void) {
GPIOE->BRR = GPIO_BRR_BR9; // 设置PE9为低电平
Delay(1, 's');
}
#include "stm32f10x.h" // 包含STM32F103ZET6的标准库
#include "uart_log.h"
#include "distance_switch.h"
void Distance_Switch_Interruption(void) {
Serial_Printf("Hello, Distance_Switch_Interruption!\n");
// 检查是否是PG15触发的中断
if (EXTI->PR & EXTI_PR_PR15) {
if (GPIOG->IDR & (1 << 15)) { // 检测PG15的上升沿
Serial_Print("PG15: 接近 (NPN传感器 - 高电平)\n");
} else { // 检测PG15的下降沿
Serial_Print("PG15: 远离 (NPN传感器 - 低电平)\n");
}
// 清除中断标志位
EXTI->PR = EXTI_PR_PR15;
}
// 检查是否是PD6触发的中断
if (EXTI->PR & EXTI_PR_PR6) {
if (GPIOD->IDR & (1 << 6)) { // 检测PD14的上升沿
Serial_Print("PD6: 接近 (PNP传感器 - 高电平)\n");
} else { // 检测PD14的下降沿
Serial_Print("PD6: 远离 (PNP传感器 - 低电平)\n");
}
// 清除中断标志位
EXTI->PR = EXTI_PR_PR6;
}
}
#include "ds18b20.h"
#include "common.h"
/******************************************************************
* 函 数 名 称:bsp_ds18b20_Init
* 函 数 说 明:MLX90614的初始化
* 函 数 形 参:无
* 函 数 返 回:1未检测到器件 0检测到器件
* 作 者:LC
* 备 注:无
******************************************************************/
char DS18B20_Init(void)
{
int ret = DS18B20_Check();//检测器件是否存在
return ret;
}
/******************************************************************
* 函 数 名 称:DS18B20_Read_Byte
* 函 数 说 明:从DS18B20读取一个字节
* 函 数 形 参:无
* 函 数 返 回:读取到的字节数据
* 作 者:LC
* 备 注:无
******************************************************************/
uint8_t DS18B20_Read_Byte(void)
{
uint8_t i=0,dat=0;
for (i=0; i<8; i++)
{
DQ_OUT();//设置为输入模式
DQ(0); //拉低
Delay(2, 'u');
DQ(1); //释放总线
DQ_IN();//设置为输入模式
Delay(12, 'u');
dat>>=1;
if( DQ_GET() )
{
dat=dat|0x80;
}
Delay(50, 'u');
}
return dat;
}
/******************************************************************
* 函 数 名 称:DS18B20_Write_Byte
* 函 数 说 明:写一个字节到DS18B20
* 函 数 形 参:dat:要写入的字节
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t i;
DQ_OUT();//设置输出模式
for (i=0; i<8; i++)
{
if ( (dat&0x01) ) //写1
{
DQ(0);
Delay(2, 'u');
DQ(1);
Delay(60, 'u');
}
else //写0
{
DQ(0);//拉低60us
Delay(60, 'u');
DQ(1);//释放总线
Delay(2, 'u');
}
dat=dat>>1;//传输下一位
}
}
/******************************************************************
* 函 数 名 称:DS18B20_Check
* 函 数 说 明:检测DS18B20是否存在
* 函 数 形 参:无
* 函 数 返 回:1:未检测到DS18B20的存在 0:存在
* 作 者:LC
* 备 注:无
******************************************************************/
uint8_t DS18B20_Check(void)
{
uint8_t timeout=0;
//复位DS18B20
DQ_OUT(); //设置为输出模式
DQ(0); //拉低DQ
Delay(750, 'u');
DQ(1); //拉高DQ
Delay(15, 'u');
//设置为输入模式
DQ_IN();
//等待拉低,拉低说明有应答
while ( DQ_GET() &&timeout<200)
{
timeout++;//超时判断
Delay(1, 'u');
};
//设备未应答
if(timeout>=200)
return 1;
else
timeout=0;
//等待18B20释放总线
while ( !DQ_GET() &&timeout<240)
{
timeout++;//超时判断
Delay(1, 'u');
};
//释放总线失败
if(timeout>=240)
return 1;
return 0;
}
/******************************************************************
* 函 数 名 称:DS18B20_Start
* 函 数 说 明:DS18B20开始温度转换
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void DS18B20_Start(void)
{
DS18B20_Check(); //查询是否有设备应答
DS18B20_Write_Byte(0xcc); //对总线上所有设备进行寻址
DS18B20_Write_Byte(0x44); //启动温度转换
}
/******************************************************************
* 函 数 名 称:DS18B20_GetTemperture
* 函 数 说 明:从ds18b20得到温度值
* 函 数 形 参:无
* 函 数 返 回:温度数据
* 作 者:LC
* 备 注:无
******************************************************************/
float DS18B20_GetTemperture(void)
{
uint16_t temp;
uint8_t dataL=0,dataH=0;
float value;
DS18B20_Start();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);//对总线上所有设备进行寻址
DS18B20_Write_Byte(0xbe);// 读取数据命令
dataL=DS18B20_Read_Byte(); //LSB
dataH=DS18B20_Read_Byte(); //MSB
temp=(dataH<<8)+dataL;//整合数据
if(dataH&0X80)//高位为1,说明是负温度
{
temp=(~temp)+1;
value=temp*(-0.0625);
}
else
{
value=temp*0.0625;
}
return value;
}
#include "ds18b20.h"
#include "common.h"
/******************************************************************
* 函 数 名 称:bsp_ds18b20_Init
* 函 数 说 明:MLX90614的初始化
* 函 数 形 参:无
* 函 数 返 回:1未检测到器件 0检测到器件
* 作 者:LC
* 备 注:无
******************************************************************/
char DS18B20_Init(void)
{
int ret = DS18B20_Check();//检测器件是否存在
return ret;
}
/******************************************************************
* 函 数 名 称:DS18B20_Read_Byte
* 函 数 说 明:从DS18B20读取一个字节
* 函 数 形 参:无
* 函 数 返 回:读取到的字节数据
* 作 者:LC
* 备 注:无
******************************************************************/
uint8_t DS18B20_Read_Byte(void)
{
uint8_t i=0,dat=0;
for (i=0;i<8;i++)
{
DQ_OUT();//设置为输入模式
DQ(0); //拉低
Delay(2, 'u');
DQ(1); //释放总线
DQ_IN();//设置为输入模式
Delay(12, 'u');
dat>>=1;
if( DQ_GET() )
{
dat=dat|0x80;
}
Delay(50, 'u');
}
return dat;
}
/******************************************************************
* 函 数 名 称:DS18B20_Write_Byte
* 函 数 说 明:写一个字节到DS18B20
* 函 数 形 参:dat:要写入的字节
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t i;
DQ_OUT();//设置输出模式
for (i=0;i<8;i++)
{
if ( (dat&0x01) ) //写1
{
DQ(0);
Delay(2, 'u');
DQ(1);
Delay(60, 'u');
}
else //写0
{
DQ(0);//拉低60us
Delay(60, 'u');
DQ(1);//释放总线
Delay(2, 'u');
}
dat=dat>>1;//传输下一位
}
}
/******************************************************************
* 函 数 名 称:DS18B20_Check
* 函 数 说 明:检测DS18B20是否存在
* 函 数 形 参:无
* 函 数 返 回:1:未检测到DS18B20的存在 0:存在
* 作 者:LC
* 备 注:无
******************************************************************/
uint8_t DS18B20_Check(void)
{
uint8_t timeout=0;
//复位DS18B20
DQ_OUT(); //设置为输出模式
DQ(0); //拉低DQ
Delay(750, 'u');
DQ(1); //拉高DQ
Delay(15, 'u');
//设置为输入模式
DQ_IN();
//等待拉低,拉低说明有应答
while ( DQ_GET() &&timeout<200)
{
timeout++;//超时判断
Delay(1, 'u');
};
//设备未应答
if(timeout>=200)
return 1;
else
timeout=0;
//等待18B20释放总线
while ( !DQ_GET() &&timeout<240)
{
timeout++;//超时判断
Delay(1, 'u');
};
//释放总线失败
if(timeout>=240)
return 1;
return 0;
}
/******************************************************************
* 函 数 名 称:DS18B20_Start
* 函 数 说 明:DS18B20开始温度转换
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void DS18B20_Start(void)
{
DS18B20_Check(); //查询是否有设备应答
DS18B20_Write_Byte(0xcc); //对总线上所有设备进行寻址
DS18B20_Write_Byte(0x44); //启动温度转换
}
/******************************************************************
* 函 数 名 称:DS18B20_GetTemperture
* 函 数 说 明:从ds18b20得到温度值
* 函 数 形 参:无
* 函 数 返 回:温度数据
* 作 者:LC
* 备 注:无
******************************************************************/
float DS18B20_GetTemperture(void)
{
uint16_t temp;
uint8_t dataL=0,dataH=0;
float value;
DS18B20_Start();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);//对总线上所有设备进行寻址
DS18B20_Write_Byte(0xbe);// 读取数据命令
dataL=DS18B20_Read_Byte(); //LSB
dataH=DS18B20_Read_Byte(); //MSB
temp=(dataH<<8)+dataL;//整合数据
if(dataH&0X80)//高位为1,说明是负温度
{
temp=(~temp)+1;
value=temp*(-0.0625);
}
else
{
value=temp*0.0625;
}
return value;
}
#include "emergency_stop.h"
#include "stm32f10x.h"
#include "uart_log.h"
// EXTI线2中断服务例程
void Emergency_Stop_Interrupt(void) {
Serial_Print("Emergency_Stop_Interrupt\n");
// PE2 急停按钮
if (EXTI->PR & EXTI_PR_PR2) {
if (GPIOE->IDR & (1 << 2)) { // 检测PE2的上升沿
Serial_Print("PE2: 抬起 (急停按钮 - 高电平)\n");
} else { // 检测PD14的下降沿
Serial_Print("PE2: 按下 (急停按钮 - 低电平)\n");
}
// 清除中断标志位
EXTI->PR = EXTI_PR_PR2;
}
}
#include "onewire.h"
#include "common.h"
// 初始化 One-Wire 总线 (PD12)
void Onewire_Init(void) {
// 设置高电平
ONEWIRE_PORT->BSRR = ONEWIRE_PIN;
}
// 设置引脚为输出模式
void Onewire_Pin_Output(void) {
// 设置PD12为推挽输出模式
GPIOD->CRH &= ~(0xF << 16); // 清除PD12的配置
GPIOD->CRH |= (0x3 << 16); // 设置为推挽输出模式
}
// 设置引脚为输入模式
void Onewire_Pin_Input(void) {
// 设置PD12为浮空输入模式
GPIOD->CRH &= ~(0xF << 16); // 清除PD12的配置
GPIOD->CRH |= (0x4 << 16); // 设置为浮空输入模式
}
// 复位 One-Wire 总线并检测传感器是否存在
uint8_t Onewire_Reset(void) {
uint8_t response = 0;
// 拉低总线 480 微秒
Onewire_Pin_Output();
ONEWIRE_PORT->BRR = ONEWIRE_PIN; // 拉低
Delay(480, 'u');
// 释放总线,并等待响应
Onewire_Pin_Input();
Delay(60, 'u');
// 检测传感器响应
response = (ONEWIRE_PORT->IDR & ONEWIRE_PIN) ? 1 : 0;
// 等待 420 微秒
Delay(420, 'u');
return !response; // 返回响应信号,0 表示设备存在
}
// 向 One-Wire 设备发送一位数据
void Onewire_SendBit(unsigned char Bit) {
Onewire_Pin_Output(); // 设置为输出模式
if (Bit) {
ONEWIRE_PORT->BRR = ONEWIRE_PIN; // 拉低 1 微秒
Delay(1, 'u');
Onewire_Pin_Input(); // 释放总线
Delay(60, 'u'); // 保持高电平 60 微秒
} else {
ONEWIRE_PORT->BRR = ONEWIRE_PIN; // 拉低 60 微秒
Delay(60, 'u');
Onewire_Pin_Input(); // 释放总线
}
}
// 从 One-Wire 设备接收一位数据
unsigned char Onewire_ReceiveBit(void) {
unsigned char Bit = 0;
Onewire_Pin_Output(); // 设置为输出模式
ONEWIRE_PORT->BRR = ONEWIRE_PIN; // 拉低 1 微秒
Delay(1, 'u');
Onewire_Pin_Input(); // 释放总线
Delay(14, 'u');
// 读取数据
if (ONEWIRE_PORT->IDR & ONEWIRE_PIN) {
Bit = 1;
}
Delay(45, 'u'); // 等待剩余时间
return Bit;
}
// 向 One-Wire 设备发送一个字节数据
void Onewire_SendByte(unsigned char Byte) {
for (unsigned char i = 0; i < 8; i++) {
Onewire_SendBit(Byte & 0x01); // 发送每一位
Byte >>= 1;
}
}
// 从 One-Wire 设备接收一个字节数据
unsigned char Onewire_ReceiveByte(void) {
unsigned char Byte = 0;
for (unsigned char i = 0; i < 8; i++) {
Byte >>= 1;
if (Onewire_ReceiveBit()) {
Byte |= 0x80; // 设置最高位
}
}
return Byte;
}
#include "parking_sensor.h"
#include "common.h"
#include "uart_log.h"
// 全局变量
volatile uint32_t pulse_time = 0; // 脉宽时间
volatile double distance_cm = 0.0; // 距离
volatile uint8_t capture_state = 0; // 捕获状态标志
volatile uint8_t last_pd14_state = 0; // 上一次 PD14 的状态
// 动态配置 PE0 - PE15 引脚
void Configure_PE_Pin(uint8_t pin, uint8_t mode) {
// 根据引脚号选择配置寄存器
if (pin < 8) {
// 配置低 8 位(PE0 - PE7)
GPIOE->CRL &= ~(0xF << (pin * 4)); // 清除该引脚的配置
GPIOE->CRL |= (mode << (pin * 4)); // 设置该引脚的模式
} else {
// 配置高 8 位(PE8 - PE15)
GPIOE->CRH &= ~(0xF << ((pin - 8) * 4)); // 清除该引脚的配置
GPIOE->CRH |= (mode << ((pin - 8) * 4)); // 设置该引脚的模式
}
}
// 发送触发信号
void SendTriggerSignal(void) {
GPIOE->BSRR = (1 << 14); // 设置 PE14 为高电平
Delay(25, 'u'); // 延时 10 微秒
GPIOE->BRR = (1 << 14); // 设置 PE14 为低电平
}
// 初始化 TIM2 捕获模式
void TIM2_Capture_Init(void)
{
// 使能TIM2时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
// 设置预分频器,使TIM2计数频率为1MHz
TIM2->PSC = 72 - 1; // 72MHz / 72 = 1MHz
// 设置自动重装载寄存器
TIM2->ARR = 0xFFFF;
// 选择计数模式
TIM2->CR1 &= ~TIM_CR1_DIR;
// 使能TIM2
//TIM2->CR1 |= TIM_CR1_CEN;
}
// 计算距离,不考虑温度校正
double CalculateDistance()
{
const double soundSpeed = 340.0; // 固定声速 = 340 m/s
const double timeToDistanceFactor = soundSpeed / 2 / 10000000.0; // 转换因子(米/us)
return pulse_time * timeToDistanceFactor * 100; // 返回距离(cm)
}
// TIM2 中断服务程序,捕获脉宽
void Parking_Sensor_Interruption(void) {
uint32_t end_time;
uint8_t pd14_level = (GPIOD->IDR & GPIO_IDR_IDR14) ? 1 : 0;
Serial_Printf("pd14_level: %u\n", pd14_level);
if (pd14_level != last_pd14_state) { // 检测到电平变化
if (pd14_level == 1 && capture_state == 0) { // 上升沿
TIM2->CNT = 0; // 清零计数器
TIM2->CR1 |= TIM_CR1_CEN; // 启动计数器
capture_state = 1; // 标记上升沿已捕获,等待下降沿
} else if (pd14_level == 0 && capture_state == 1) { // 下降沿且上升沿已捕获
end_time = TIM2->CNT; // 读取当前计数器值作为脉宽时间
pulse_time = end_time; // 记录脉宽时间
TIM2->CR1 &= ~TIM_CR1_CEN; // 关闭计数器
TIM2->CNT = 0; // 清零计数器
capture_state = 0; // 重置捕获状态
// 计算距离
distance_cm = CalculateDistance();
// 打印距离信息
Serial_Printf("EXTI14_IRQHandler Pulse Time: %u us, Distance: %.5f cm\n", pulse_time, distance_cm);
}
last_pd14_state = pd14_level;
}
}
#include "parking_sensor.h"
#include "common.h"
#include "uart_log.h"
// 全局变量
volatile uint32_t pulse_time = 0; // 脉宽时间
volatile double distance_cm = 0.0; // 距离
volatile uint8_t capture_state = 0; // 捕获状态标志
volatile uint8_t last_pd14_state = 0; // 上一次 PD14 的状态
int HH = 1000000;
// 动态配置 PE0 - PE15 引脚
void Configure_PE_Pin(uint8_t pin, uint8_t mode) {
// 使能 GPIOE 时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPEEN;
// 根据引脚号选择配置寄存器
if (pin < 8) {
// 配置低 8 位(PE0 - PE7)
GPIOE->CRL &= ~(0xF << (pin * 4)); // 清除该引脚的配置
GPIOE->CRL |= (mode << (pin * 4)); // 设置该引脚的模式
} else {
// 配置高 8 位(PE8 - PE15)
GPIOE->CRH &= ~(0xF << ((pin - 8) * 4)); // 清除该引脚的配置
GPIOE->CRH |= (mode << ((pin - 8) * 4)); // 设置该引脚的模式
}
}
// 发送触发信号
void SendTriggerSignal(void) {
GPIOE->BSRR = (1 << 14); // 设置 PE14 为高电平
Delay(15, 'u'); // 延时 10 微秒
GPIOE->BRR = (1 << 14); // 设置 PE14 为低电平
}
// 初始化 TIM2 捕获模式
void TIM2_Capture_Init(void)
{
// 使能TIM2时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
// 设置预分频器,使TIM2计数频率为1MHz
TIM2->PSC = 72 - 1; // 72MHz / 72 = 1MHz
// 设置自动重装载寄存器
TIM2->ARR = 0xFFFF;
// 选择计数模式
TIM2->CR1 &= ~TIM_CR1_DIR; // 向上计数
// 使能TIM2
TIM2->CR1 |= TIM_CR1_CEN;
}
// 计算距离,不考虑温度校正
double CalculateDistance()
{
const double soundSpeed = 340.0; // 固定声速 = 340 m/s
const double timeToDistanceFactor = soundSpeed / 2 / 10000000.0; // 转换因子(米/us)
return pulse_time * timeToDistanceFactor * 100; // 返回距离(cm)
}
// TIM2 中断服务程序,捕获脉宽
void Parking_Sensor_Interruption(void)
{
static uint32_t start_time = 0;
uint32_t end_time;
volatile uint32_t idr_value = GPIOD->IDR;
uint8_t pd14_state = ((idr_value & (1 << 14)) != 0) ? 1 : 0;
Serial_Printf("PD14: %u\n", pd14_state);
if (pd14_state != last_pd14_state) // 检测到电平变化
{
if (pd14_state && capture_state == 0 ) // 上升沿
{
start_time = TIM2->CNT; // 记录上升沿时间
capture_state = 1; // 标记上升沿已捕获
}
else {
end_time = TIM2->CNT; // 记录下降沿时间
pulse_time = (end_time >= start_time) ? (end_time - start_time) : (0xFFFF - start_time + end_time + 1);
Serial_Printf("下降沿: %u \n", pulse_time);
capture_state = 2; // 标记捕获完成
// 计算距离
distance_cm = CalculateDistance();
// 打印距离信息
Serial_Printf("EXTI14_IRQHandler Pulse Time: %u, Distance: %.5f cm\n", pulse_time, distance_cm);
}
last_pd14_state = pd14_state ;
}
}
\ No newline at end of file
#include "stm32f10x.h" // 包含STM32F103ZET6的标准库
#include "photoelectric_switch.h"
#include "uart_log.h"
void Photoelectric_Switch_Interrupt(void) {
if (EXTI->PR & EXTI_PR_PR9) { // 检查是否是中断线9触发的中断(PB9)
if (GPIOB->IDR & (1 << 9)) { // 检测PB9的上升沿
Serial_Printf("PB9: 物体遮挡 (NPN 传感器 - 高电平)\n");
} else { // 检测PB9的下降沿
Serial_Printf("PB9: 物体移开 (NPN 传感器 - 低电平)\n");
}
// 清除中断标志位
EXTI->PR = EXTI_PR_PR9;
}
if (EXTI->PR & EXTI_PR_PR0) { // 检查是否是中断线0触发的中断(PE0)
if (GPIOE->IDR & (1 << 0)) { // 检测PE0的上升沿
Serial_Printf("PE0: 物体遮挡 (NPN 传感器 - 高电平)\n");
} else { // 检测PE0的下降沿
Serial_Printf("PE0: 物体移开 (NPN 传感器 - 低电平)\n");
}
// 清除中断标志位
EXTI->PR = EXTI_PR_PR0;
}
}
#include "stm32f10x.h" // 包含STM32F103ZET6的标准库
#include "photoelectric_switch.h"
#include "uart_log.h"
void Photoelectric_Switch_Interrupt(void) {
if (EXTI->PR & EXTI_PR_PR9) { // 检查是否是中断线9触发的中断(PB9)
if (GPIOB->IDR & (1 << 9)) { // 检测PB9的上升沿
Serial_Printf("PB9: 物体遮挡 (NPN 传感器 - 高电平)\r\n");
} else { // 检测PB9的下降沿
Serial_Printf("PB9: 物体移开 (NPN 传感器 - 低电平)\r\n");
}
// 清除中断标志位
EXTI->PR = EXTI_PR_PR9;
}
if (EXTI->PR & EXTI_PR_PR0) { // 检查是否是中断线0触发的中断(PE0)
if (GPIOE->IDR & (1 << 0)) { // 检测PE0的上升沿
Serial_Printf("PE0: 物体遮挡 (NPN 传感器 - 高电平)\r\n");
} else { // 检测PE0的下降沿
Serial_Printf("PE0: 物体移开 (NPN 传感器 - 低电平)\r\n");
}
// 清除中断标志位
EXTI->PR = EXTI_PR_PR0;
}
}
#include "pneumatic_solenoid.h"
#include "stm32f10x.h"
#include "uart_log.h"
//控制气动电磁阀的高低电平
void Pneumatic_Solenoid_Control(uint8_t index,unsigned char bitValue) {
switch (index) {
case 0 :
if (bitValue != 0) {
// 如果bitValue不为0,设置PF13为高电平
GPIOF->ODR |= (1 << 13);
} else {
// 如果bitValue为0,设置PF13为低电平
GPIOF->ODR &= ~(1 << 13);
}
break;
case 0x01:
if (bitValue != 0) {
// 如果bitValue不为0,设置PF14为高电平
GPIOF->ODR |= (1 << 14);
} else {
// 如果bitValue为0,设置PF14为低电平
GPIOF->ODR &= ~(1 << 14);
}
break;
case 0x02:
if (bitValue != 0) {
// 如果bitValue不为0,设置PF15为高电平
GPIOF->ODR |= (1 << 15);
} else {
// 如果bitValue为0,设置PF15为低电平
GPIOF->ODR &= ~(1 << 15);
}
break;
case 0x03:
if (bitValue != 0) {
// 如果bitValue不为0,设置PG0为高电平
GPIOG->ODR |= (1 << 0);
} else {
// 如果bitValue为0,设置PG0为低电平
GPIOG->ODR &= ~(1 << 0);
}
break;
case 0x04:
if (bitValue != 0) {
// 如果bitValue不为0,设置PG1为高电平
GPIOG->ODR |= (1 << 1);
} else {
// 如果bitValue为0,设置PG1为低电平
GPIOG->ODR &= ~(1 << 1);
}
break;
case 0x05:
if (bitValue != 0) {
// 如果bitValue不为0,设置PE7为高电平
GPIOE->ODR |= (1 << 7);
} else {
// 如果bitValue为0,设置PE7为低电平
GPIOE->ODR &= ~(1 << 7);
}
break;
case 0x06:
if (bitValue != 0) {
// 如果bitValue不为0,设置PE8为高电平
GPIOE->ODR |= (1 << 8);
} else {
// 如果bitValue为0,设置PE8为低电平
GPIOE->ODR &= ~(1 << 8);
}
break;
default :
Serial_Print("不存在阀门! \n");
break;
}
}
// 查询气动电磁阀的电平
unsigned char find_Pneumatic_Solenoid(uint8_t index) {
switch (index) {
case 0:
return (GPIOF->IDR & (1 << 13)) ? 1 : 0;
case 1:
return (GPIOF->IDR & (1 << 14)) ? 1 : 0;
case 2:
return (GPIOF->IDR & (1 << 15)) ? 1 : 0;
case 3:
return (GPIOG->IDR & (1 << 0)) ? 1 : 0;
case 4:
return (GPIOG->IDR & (1 << 1)) ? 1 : 0;
case 5:
return (GPIOE->IDR & (1 << 7)) ? 1 : 0;
case 6:
return (GPIOE->IDR & (1 << 8)) ? 1 : 0;
default:
Serial_Print("不存在阀门! \n");
return 0;
}
}
#include "pneumatic_solenoid.h"
#include "stm32f10x.h"
void Pneumatic_Solenoid_Init(void) {
RCC->APB2ENR |= RCC_APB2ENR_IOPFEN; // 启用GPIOF时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPGEN; // 启用GPIOG时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPEEN; // 启用GPIOE时钟
// 配置 PF13, PF14, PF15 为复用推挽输出 (50 MHz)
GPIOF->CRH &= ~(0xF << 4*5); // 清空 PF13 配置 (位20-23)
GPIOF->CRH |= (0xB << 4*5); // 配置 PF13 为复用推挽输出
GPIOF->CRH &= ~(0xF << 4*6); // 清空 PF14 配置 (位24-27)
GPIOF->CRH |= (0xB << 4*6); // 配置 PF14 为复用推挽输出
GPIOF->CRH &= ~(0xF << 4*7); // 清空 PF15 配置 (位28-31)
GPIOF->CRH |= (0xB << 4*7); // 配置 PF15 为复用推挽输出
// 配置 PG0, PG1 为复用推挽输出 (50 MHz)
GPIOG->CRL &= ~(0xF << 4*0); // 清空 PG0 配置 (位0-3)
GPIOG->CRL |= (0xB << 4*0); // 配置 PG0 为复用推挽输出
GPIOG->CRL &= ~(0xF << 4*1); // 清空 PG1 配置 (位4-7)
GPIOG->CRL |= (0xB << 4*1); // 配置 PG1 为复用推挽输出
// 配置 PE7, PE8 为复用推挽输出 (50 MHz)
GPIOE->CRH &= ~(0xF << 4*1); // 清空 PE7 配置 (位20-23)
GPIOE->CRH |= (0xB << 4*1); // 配置 PE7 为复用推挽输出
GPIOE->CRH &= ~(0xF << 4*2); // 清空 PE8 配置 (位24-27)
GPIOE->CRH |= (0xB << 4*2); // 配置 PE8 为复用推挽输出
}
//控制气动电磁阀的高低电平
void Pneumatic_Solenoid_Control(uint8_t index,unsigned char bitValue) {
switch (index) {
case 0 :
break;
case 0x01:
break;
case 0x02:
break;
case 0x03:
break;
case 0x04:
break;
case 0x05:
break;
case 0x06:
break;
default : /* 可选的 */
statement(s);
}
}
//查询气动电磁阀的电平
unsigned char find_Pneumatic_Solenoid(uint8_t index);
#include "step_motor.h"
#include "rotate_motor.h"
#include "stm32f10x.h"
// 初始化步进电机控制
void StepperMotor_Init(void){
// 使能 GPIOC 和 GPIOF 的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
RCC->APB2ENR |= RCC_APB2ENR_IOPFEN;
// 使能 AFIO 时钟,用于重映射
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
// 配置 PC6 引脚为复用推挽输出 (50 MHz)
GPIOC->CRL &= ~(0xF << 24); // 清空 PC6 配置
GPIOC->CRL |= (0xB << 24); // 配置为复用推挽输出 (0xB = 1011)
// 配置 PC5 为通用推挽输出 (方向)
GPIOC->CRL &= ~(0xF << 20); // 清空 PC5 配置
GPIOC->CRL |= (0x3 << 20); // 配置为通用推挽输出 (0x3 = 0011)
// 配置 PF11 为通用推挽输出 (使能)
GPIOF->CRH &= ~(0xF <<12); // 清空 PF11 配置
GPIOF->CRH |= (0x3 << 12); // 配置为通用推挽输出 (0x3 = 0011)
// 重映射 TIM3_CH1 到 PC6
AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_FULLREMAP;
}
#include "common.h"
// 初始化定时器 TIM3 函数
void TIM3_Init(uint16_t &psc,uint16_t &arr);
void TIM3_CH1_Init(uint16_t psc,uint16_t arr){
// 使能 TIM3 时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
......@@ -49,21 +25,10 @@ void TIM3_Init(uint16_t &psc,uint16_t &arr);
}
//f定时器输出频率 系统时钟/(PSC+1)*(ARR+1)
void Timer_Frequency(int &frequency, StepMotor *stepMotor) {
// 预先计算 psc 和 arr
int psc_plus_1 = stepMotor->psc + 1;
int arr_plus_1 = stepMotor->arr + 1;
// 简化并避免除法的额外开销
frequency = 72000000 / (psc_plus_1 * arr_plus_1);
}
// 设置方向
// 设置方向函数
void Set_Direction(int direction) {
if (direction) {
void Rotate_SetDirection(int direction){
if (direction){
GPIOC->ODR |= (1 << 5); // 设置高电平 (顺时针方向)
} else {
GPIOC->ODR &= ~(1 << 5); // 设置低电平 (逆时针方向)
......@@ -71,8 +36,9 @@ void Set_Direction(int direction) {
}
// 使能控制函数
void Enable_Stepper(bool enable) {
// 使能控制函数
void Rotate_Enable_Rotate(bool enable) {
if (enable) {
GPIOF->ODR &= ~(1 << 11); // 设置低电平 (使能步进电机)
} else {
......@@ -92,7 +58,7 @@ void Set_PWM_Frequency(uint32_t frequency) {
// 梯形加速函数
void StepMotor_Accelerate(uint32_t targetRPM, uint32_t acceleration) {
void RotateMotor_Accelerate(uint32_t targetRPM, uint32_t acceleration) {
uint32_t currentRPM = 0;
uint32_t deltaRPM = (acceleration / 60000) * 10; // 10ms内的速度增量
......@@ -110,8 +76,8 @@ void StepMotor_Accelerate(uint32_t targetRPM, uint32_t acceleration) {
currentRPM = targetRPM; // 防止超过目标速度
}
// 延时 10ms,每次迭代增加速度
Delay(10);
// 延时 10ms,每次迭代增加速度
Delay(10, 'm');
}
// 达到目标速度,保持目标速度的PWM频率
......@@ -119,8 +85,10 @@ void StepMotor_Accelerate(uint32_t targetRPM, uint32_t acceleration) {
Set_PWM_Frequency(finalFrequency);
}
// 梯形减速函数:将当前转速逐步减速为 0
void StepMotor_Decelerate(uint32_t currentRPM, uint32_t deceleration) {
void RotateMotor_Decelerate(uint32_t currentRPM, uint32_t deceleration) {
uint32_t deltaRPM = (deceleration / 60000) * 10; // 10ms 内的速度减量
while (currentRPM > 0) {
......@@ -135,42 +103,36 @@ void StepMotor_Decelerate(uint32_t currentRPM, uint32_t deceleration) {
currentRPM = 0;
}
Delay(10);
Delay(10, 'm');
}
Set_PWM_Frequency(0);
}
void Delay(uint32_t delay) {
for (volatile uint32_t i = 0; i < delay * 1000; i++) {
__NOP(); // 空操作,用于延时
}
}
void Update_Motor_Status(StepMotor *motor, SpeedStatus status, uint32_t targetSpeed, uint32_t acceleration) {
motor->speedStatus = status; // 更新电机的速度状态
motor->desSpeed = targetSpeed; // 更新目标速度
motor->acceleration = acceleration; // 更新加速度
void Update_Motor_Status(RotateMotor *motor, SpeedStatus status, uint32_t targetSpeed, uint32_t acceleration) {
motor->base.speedStatus = status; // 更新电机的速度状态
motor->base.desSpeed= targetSpeed; // 更新目标速度
motor->base.acceleration = acceleration; // 更新加速度
switch (status) {
case SPEED_ACC:
// 加速过程
StepMotor_Accelerate(targetSpeed, acceleration);
// 加速过程
RotateMotor_Accelerate(targetSpeed, acceleration);
break;
case SPEED_DEC:
// 减速过程
StepMotor_Decelerate(motor->curSpeed, acceleration);
RotateMotor_Decelerate(motor->base.curSpeed, acceleration);
break;
case SPEED_NONE:
// 匀速,保持当前速度
Set_PWM_Frequency((motor->curSpeed * STEPMOTOR_PULSEPERROUND) / 60);
Set_PWM_Frequency((motor->base.curSpeed * STEPMOTOR_PULSEPERROUND) / 60);
break;
case SPEED_STOP:
// 停止电机
motor->curSpeed = 0;
motor->base.curSpeed = 0;
Set_PWM_Frequency(0); // 关闭PWM
break;
......
#include "temperature_sensor.h"
#include "onewire.h"
#include "uart_log.h"
#include <stddef.h> // 引入 size_t 类型定义
#define CRC8_POLYNOMIAL 0x31
uint8_t crc8(const uint8_t *buf, size_t len) {
uint8_t crc = 0;
for (size_t pos = 0; pos < len; ++pos) {
crc ^= buf[pos];
for (uint8_t bit = 8; bit; --bit) {
if (crc & 0x80) {
crc = (crc << 1) ^ CRC8_POLYNOMIAL;
} else {
crc = (crc << 1);
}
}
}
return crc;
}
void TemperatureSensor_ConvertT(void) {
Onewire_Init(); // 初始化 One-Wire 总线
if (!Onewire_Reset()) { // 复位总线并检查是否有设备响应
Serial_Printf("No device detected.\n");
return;
}
// 跳过 ROM
Onewire_SendByte(0xCC);
// 启动温度转换
Onewire_SendByte(0x44); // 启动温度转换命令
}
float TemperatureSensor_ReadT(void) {
// uint8_t rom_address[8]; // 存储ROM地址 如果不需要,可以移除这一行
uint8_t scratchpad[9]; // 存储Scratchpad数据
uint8_t crc_result;
int16_t Temp;
float temperature;
Onewire_Init(); // 初始化 One-Wire 总线
if (!Onewire_Reset()) { // 复位总线并检查是否有设备响应
Serial_Printf("No device detected.\n");
return -1.0;
}
// 跳过 ROM
Onewire_SendByte(0xCC);
// 读取 Scratchpad
Onewire_SendByte(0xBE);
// 读取 Scratchpad 数据
for (int i = 0; i < 9; i++) {
scratchpad[i] = Onewire_ReceiveByte();
}
// 计算 CRC 并验证
crc_result = crc8(scratchpad, 8);
if (crc_result != scratchpad[8]) {
Serial_Printf("CRC error.\n");
return -1.0;
}
// 提取温度数据
uint8_t TLSB = scratchpad[0]; // 低字节
uint8_t TMSB = scratchpad[1]; // 高字节
Temp = (TMSB << 8) | TLSB; // 合并两个字节
temperature = Temp / 16.0; // 计算实际温度
Serial_Printf("TLSB: %02X, TMSB: %02X, Temp: %d, Temperature: %.2f C\n",
TLSB, TMSB, Temp, temperature);
return temperature;
}
//#include "uart_log.h"
//#include <stdarg.h>
//#include <string.h>
//#include <stdio.h> // 包含<stdio.h>头文件
//// 缓冲区大小
//#define SERIAL_BUFFER_SIZE 128
//// USART1 GPIO初始化
//void USART1_GPIO_Init(void) {
// // 使能GPIOA和USART1时钟
// RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
// GPIOA->CRH &= ~(0xF << 4); // 清除PA9配置
// GPIOA->CRH |= (0xB << 4); // 配置PA9为复用功能推挽输出
// GPIOA->CRH &= ~(0xF << 8); // 清除PA10配置
// GPIOA->CRH |= (0x4 << 8); // 配置PA10为浮空输入(接收器)
//}
//// USART1初始化
//void USART1_Init(void) {
// // 设置波特率
// USART1->BRR =0x1D4C;
// // 配置USART1
// USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; // 使能USART1、发送器和接收器
// USART1->CR2 = 0; // 不使用流控制
// USART1->CR3 = 0; // 不使用额外功能
//}
//// 发送一个字符
//void USART1_SendChar(char ch) {
// while (!(USART1->SR & USART_SR_TXE)); // 等待发送缓冲区为空
// USART1->DR = (ch & 0xFF); // 发送字符
//}
//// 发送字符串
//void USART1_SendString(const char *str) {
// while (*str) {
// USART1_SendChar(*str++);
// }
//}
//// 格式化字符串并发送
//void USART1_SendFormatted(const char *format, ...) {
// char buffer[SERIAL_BUFFER_SIZE];
// va_list args;
// va_start(args, format);
// vsnprintf(buffer, sizeof(buffer), format, args);
// va_end(args);
// USART1_SendString(buffer);
//}
//// 初始化串口日志
//void Serial_Init(void) {
// USART1_GPIO_Init();
// USART1_Init();
//}
//// 打印字符串
//void Serial_Print(const char *str) {
// USART1_SendString(str);
//}
//// 打印字符
//void Serial_Write(char ch) {
// USART1_SendChar(ch);
//}
//// 打印格式化字符串
//void Serial_Printf(const char *format, ...) {
// va_list args;
// va_start(args, format);
// USART1_SendFormatted(format, args);
// va_end(args);
//}
#include "uart_log.h"
#include <stdarg.h>
#include <string.h>
#include <stdio.h> // 包含<stdio.h>头文件
// 缓冲区大小
#define SERIAL_BUFFER_SIZE 128
// USART1 GPIO初始化
void USART1_GPIO_Init(void) {
// 使能GPIOA和USART1时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
GPIOA->CRH &= ~(0xF << 20);
GPIOA->CRH |= (0xB << 20);
GPIOA->CRH &= ~(0xF << 24); // 清除模式控制位
GPIOA->CRH |= (0x4 << 24); // 设置为浮空输入
GPIOA->CRH &= ~(0xF << 4);
GPIOA->CRH |= (0xB << 4);
GPIOA->CRH &= ~(0xF << 8);
GPIOA->CRH |= (0x4 << 8);
}
// USART1初始化
void USART1_Init(void) {
// 设置波特率
uint32_t BRR = (uint32_t)(SystemCoreClock / 16 / 115200);
USART1->BRR = BRR;
// 配置USART1
USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE; // 使能USART1、发送器和接收器
USART1->CR2 = 0; // 不使用流控制
USART1->CR3 = 0; // 不使用额外功能
USART1->BRR = 0x1D4C;
USART1->CR1 = USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
USART1->CR2 = 0;
USART1->CR3 = 0;
}
// 发送一个字符
void USART1_SendChar(char ch) {
while (!(USART1->SR & USART_SR_TXE)); // 等待发送缓冲区为空
USART1->DR = (ch & 0xFF); // 发送字符
while (!(USART1->SR & USART_SR_TXE));
USART1->DR = (ch & 0xFF);
}
// 发送字符串
void USART1_SendString(const char *str) {
while (*str) {
USART1_SendChar(*str++);
}
}
// 格式化字符串并发送
void USART1_SendFormatted(const char *format, ...) {
char buffer[SERIAL_BUFFER_SIZE];
va_list args;
va_start(args, format);
vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
USART1_SendString(buffer);
}
// 初始化串口日志
void Serial_Init(void) {
USART1_GPIO_Init();
USART1_Init();
}
// 打印字符串
void Serial_Print(const char *str) {
USART1_SendString(str);
}
// 打印字符
void Serial_Write(char ch) {
USART1_SendChar(ch);
}
// 打印格式化字符串
void Serial_Printf(const char *format, ...) {
char buffer[SERIAL_BUFFER_SIZE];
va_list args;
va_start(args, format);
USART1_SendFormatted(format, args);
vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
USART1_SendString(buffer);
}
#include "walking_motor.h"
#include "common.h"
#include "stm32f10x.h"
// 初始化定时器 TIM3 函数
void TIM3_CH2_Init(uint16_t psc,uint16_t arr){
// 使能 TIM3 时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
// 设置预分频器为 72-1,使时钟频率为 1 MHz (72 MHz / 72)
TIM3->PSC = psc;//72 - 1;
// 设置自动重装载值为 1000 - 1,对应于 1 毫秒 (1 MHz * 1 ms)
TIM3->ARR =arr;//1000 - 1;
// 配置 TIM3 通道 1 为 PWM 模式 1
TIM3->CCMR1 &= ~TIM_CCMR1_OC2M; // 清空模式位
TIM3->CCMR1 |= TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2; // PWM 模式1
TIM3->CCER |= TIM_CCER_CC2E; // 使能通道 1 输出
TIM3->CCR2 = 500; // 设置占空比为 50%
// 使能 TIM3
TIM3->CR1 |= TIM_CR1_CEN;
}
// 设置方向
// 设置方向函数
void Walking_SetDirection(int direction){
if (direction){
GPIOC->ODR |= (1 << 5); // 设置高电平 (顺时针方向)
} else {
GPIOC->ODR &= ~(1 << 5); // 设置低电平 (逆时针方向)
}
}
// 使能控制函数
void Walking_Enable_Rotate(bool enable) {
if (enable) {
GPIOF->ODR &= ~(1 << 11); // 设置低电平 (使能步进电机)
} else {
GPIOF->ODR |= (1 << 11); // 设置高电平 (关闭步进电机)
}
}
// 设置PWM频率
void Walking_Set_PWM_Frequency(uint32_t frequency) {
// 计算ARR值
uint32_t arr_value = (SYSCLK_FREQUENCY / ((TIM3->PSC + 1) * frequency)) - 1;
// 更新自动重装载寄存器
TIM3->ARR = arr_value;
TIM3->CCR2 = arr_value / 2; // 保持50%占空比
}
// 梯形加速函数
void WalkingMotor_Accelerate(uint32_t targetRPM, uint32_t acceleration) {
uint32_t currentRPM = 0;
uint32_t deltaRPM = (acceleration / 60000) * 10; // 10ms内的速度增量
while (currentRPM < targetRPM) {
if (currentRPM == 0) {
currentRPM = 100;
}
// 更新PWM频率
uint32_t pwmFrequency = (currentRPM * STEPMOTOR_PULSEPERROUND) / 60;
Walking_Set_PWM_Frequency(pwmFrequency);
// 每次加速的增量
currentRPM += deltaRPM;
if (currentRPM > targetRPM) {
currentRPM = targetRPM; // 防止超过目标速度
}
// 延时 10ms,每次迭代增加速度
Delay(10, 'm');
}
// 达到目标速度,保持目标速度的PWM频率
uint32_t finalFrequency = (targetRPM * STEPMOTOR_PULSEPERROUND) / 60;
Walking_Set_PWM_Frequency(finalFrequency);
}
// 梯形减速函数:将当前转速逐步减速为 0
void WalkingMotor_Decelerate(uint32_t currentRPM, uint32_t deceleration) {
uint32_t deltaRPM = (deceleration / 60000) * 10; // 10ms 内的速度减量
while (currentRPM > 0) {
// 计算 PWM 频率
uint32_t pwmFrequency = (currentRPM * STEPMOTOR_PULSEPERROUND) / 60;
Walking_Set_PWM_Frequency(pwmFrequency); // 更新PWM频率以调整电机速度
// 每次减速的增量
if (currentRPM > deltaRPM) {
currentRPM -= deltaRPM; // 减速
} else {
currentRPM = 0;
}
Delay(10, 'm');
}
Walking_Set_PWM_Frequency(0);
}
void Walking_Update_Motor_Status(WalkingMotor *motor, SpeedStatus status, uint32_t targetSpeed, uint32_t acceleration) {
motor->base.speedStatus = status; // 更新电机的速度状态
motor->base.desSpeed = targetSpeed; // 更新目标速度
motor->base.acceleration = acceleration; // 更新加速度
switch (status) {
case SPEED_ACC:
// 加速过程
WalkingMotor_Accelerate(targetSpeed, acceleration);
break;
case SPEED_DEC:
// 减速过程
WalkingMotor_Decelerate(motor->base.curSpeed, acceleration);
break;
case SPEED_NONE:
// 匀速,保持当前速度
Walking_Set_PWM_Frequency((motor->base.curSpeed * STEPMOTOR_PULSEPERROUND) / 60);
break;
case SPEED_STOP:
// 停止电机
motor->base.curSpeed = 0;
Walking_Set_PWM_Frequency(0); // 关闭PWM
break;
default:
break;
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -147,7 +147,7 @@
<RestoreSysVw>1</RestoreSysVw>
</Target>
<RunDebugAfterBuild>0</RunDebugAfterBuild>
<TargetSelection>1</TargetSelection>
<TargetSelection>11</TargetSelection>
<SimDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
......@@ -161,7 +161,7 @@
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
<Driver>BIN\UL2CM3.DLL</Driver>
<Driver>STLink\ST-LINKIII-KEIL_SWO.dll</Driver>
</TargetDlls>
</DebugOption>
<Utilities>
......@@ -419,24 +419,139 @@
<GroupName>Module</GroupName>
<Files>
<File>
<FileName>StepMotor.h</FileName>
<FileName>uart_log.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\StepMotor.h</FilePath>
<FilePath>.\Module\Inc\uart_log.h</FilePath>
</File>
<File>
<FileName>uart_log.h</FileName>
<FileName>uart_log.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\uart_log.c</FilePath>
</File>
<File>
<FileName>walking_motor.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\uart_log.h</FilePath>
<FilePath>.\Module\Inc\walking_motor.h</FilePath>
</File>
<File>
<FileName>rotate_motor.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\rotate_motor.h</FilePath>
</File>
<File>
<FileName>StepMotor.c</FileName>
<FileName>rotate_motor.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\StepMotor.c</FilePath>
<FilePath>.\Module\Src\rotate_motor.c</FilePath>
</File>
<File>
<FileName>uart_log.c</FileName>
<FileName>pneumatic_solenoid.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\pneumatic_solenoid.h</FilePath>
</File>
<File>
<FileName>pneumatic_solenoid.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\uart_log.c</FilePath>
<FilePath>.\Module\Src\pneumatic_solenoid.c</FilePath>
</File>
<File>
<FileName>parking_sensor.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\parking_sensor.c</FilePath>
</File>
<File>
<FileName>common.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\common.h</FilePath>
</File>
<File>
<FileName>parking_sensor.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\parking_sensor.h</FilePath>
</File>
<File>
<FileName>common.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\common.c</FilePath>
</File>
<File>
<FileName>distance_switch.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\distance_switch.h</FilePath>
</File>
<File>
<FileName>distance_switch.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\distance_switch.c</FilePath>
</File>
<File>
<FileName>photoelectric_switch.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\photoelectric_switch.h</FilePath>
</File>
<File>
<FileName>photoelectric_switch.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\photoelectric_switch.c</FilePath>
</File>
<File>
<FileName>temperature_sensor.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\temperature_sensor.h</FilePath>
</File>
<File>
<FileName>onewire.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\onewire.h</FilePath>
</File>
<File>
<FileName>onewire.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\onewire.c</FilePath>
</File>
<File>
<FileName>temperature_sensor.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\temperature_sensor.c</FilePath>
</File>
<File>
<FileName>emergency_stop.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\emergency_stop.h</FilePath>
</File>
<File>
<FileName>emergency_stop.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\emergency_stop.c</FilePath>
</File>
<File>
<FileName>buzzer.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\buzzer.h</FilePath>
</File>
<File>
<FileName>buzzer.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\buzzer.c</FilePath>
</File>
<File>
<FileName>motor_common.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\motor_common.h</FilePath>
</File>
<File>
<FileName>walking_motor.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\walking_motor.c</FilePath>
</File>
<File>
<FileName>ds18b20.h</FileName>
<FileType>5</FileType>
<FilePath>.\Module\Inc\ds18b20.h</FilePath>
</File>
<File>
<FileName>ds18b20.c</FileName>
<FileType>1</FileType>
<FilePath>.\Module\Src\ds18b20.c</FilePath>
</File>
</Files>
</Group>
......
[EXTDLL]
Count=0
No preview for this file type
......@@ -17,24 +17,46 @@ Library Manager: ArmAr.exe V5.05 update 1 (build 106)
Hex Converter: FromElf.exe V5.05 update 1 (build 106)
CPU DLL: SARMCM3.DLL V5.14.0.0
Dialog DLL: DCM.DLL V1.13.1.0
Target DLL: UL2CM3.DLL V1.155.0.0
Target DLL: STLink\ST-LINKIII-KEIL_SWO.dll V2.0.14.0_KEIL
Dialog DLL: TCM.DLL V1.14.4.0
<h2>Project:</h2>
D:\Ƕʽ\mcu\Motor_Control\MotorControl.uvprojx
Project File Date: 09/25/2024
Project File Date: 10/28/2024
<h2>Output:</h2>
Build target 'PWM'
compiling main.c...
.\Module\Inc\parking_sensor.h(25): warning: #1295-D: Deprecated declaration CalculateDistance - give arg types
double CalculateDistance();
main.c: 1 warning, 0 errors
compiling uart_log.c...
compiling step_motor.c...
compiling rotate_motor.c...
compiling pneumatic_solenoid.c...
compiling parking_sensor.c...
.\Module\Inc\parking_sensor.h(25): warning: #1295-D: Deprecated declaration CalculateDistance - give arg types
double CalculateDistance();
Module\Src\parking_sensor.c: 1 warning, 0 errors
compiling common.c...
.\Module\Inc\parking_sensor.h(25): warning: #1295-D: Deprecated declaration CalculateDistance - give arg types
double CalculateDistance();
Module\Src\common.c(109): warning: #61-D: integer operation result is out of range
GPIOE->CRL &= ~(0xF << (4*7)); // 清空 PE7 配置 (?0-23)
Module\Src\common.c: 2 warnings, 0 errors
compiling distance_switch.c...
compiling photoelectric_switch.c...
compiling onewire.c...
compiling temperature_sensor.c...
compiling emergency_stop.c...
compiling buzzer.c...
compiling walking_motor.c...
compiling ds18b20.c...
assembling startup_stm32f10x_hd.s...
compiling system_stm32f10x.c...
linking...
Program Size: Code=1196 RO-data=336 RW-data=20 ZI-data=1636
Program Size: Code=12812 RO-data=916 RW-data=20 ZI-data=1636
FromELF: creating hex file...
".\Objects\MotorControl.axf" - 0 Error(s), 0 Warning(s).
".\Objects\MotorControl.axf" - 0 Error(s), 4 Warning(s).
<h2>Software Packages used:</h2>
......@@ -53,10 +75,10 @@ Package Vendor: Keil
<h2>Collection of Component Files used:</h2>
* Component: Keil::Device:Startup:1.0.0
Source file: Device\Source\ARM\startup_stm32f10x_hd.s
Source file: Device\Source\ARM\STM32F1xx_OPT.s
Source file: Device\Source\system_stm32f10x.c
Include file: RTE_Driver\Config\RTE_Device.h
Source file: Device\Source\ARM\STM32F1xx_OPT.s
Source file: Device\Source\ARM\startup_stm32f10x_hd.s
</pre>
</body>
</html>
--cpu Cortex-M3
".\objects\main.o"
".\objects\uart_log.o"
".\objects\step_motor.o"
".\objects\rotate_motor.o"
".\objects\pneumatic_solenoid.o"
".\objects\parking_sensor.o"
".\objects\common.o"
".\objects\distance_switch.o"
".\objects\photoelectric_switch.o"
".\objects\onewire.o"
".\objects\temperature_sensor.o"
".\objects\emergency_stop.o"
".\objects\buzzer.o"
".\objects\walking_motor.o"
".\objects\ds18b20.o"
".\objects\startup_stm32f10x_hd.o"
".\objects\system_stm32f10x.o"
--strict --scatter ".\Objects\MotorControl.sct"
......
.\objects\buzzer.o: Module\Src\buzzer.c
.\objects\buzzer.o: .\Module\Inc\buzzer.h
.\objects\buzzer.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\buzzer.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\buzzer.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\buzzer.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\buzzer.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\buzzer.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\buzzer.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\buzzer.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\buzzer.o: .\Module\Inc\common.h
.\objects\common.o: Module\Src\common.c
.\objects\common.o: .\Module\Inc\common.h
.\objects\common.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\common.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\common.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\common.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\common.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\common.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\common.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\common.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\common.o: .\Module\Inc\parking_sensor.h
.\objects\common.o: .\Module\Inc\distance_switch.h
.\objects\common.o: .\Module\Inc\photoelectric_switch.h
.\objects\common.o: .\Module\Inc\emergency_stop.h
.\objects\common.o: .\Module\Inc\uart_log.h
.\objects\distance_switch.o: Module\Src\distance_switch.c
.\objects\distance_switch.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\distance_switch.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\distance_switch.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\distance_switch.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\distance_switch.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\distance_switch.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\distance_switch.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\distance_switch.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\distance_switch.o: .\Module\Inc\uart_log.h
.\objects\distance_switch.o: .\Module\Inc\distance_switch.h
.\objects\ds18b20.o: Module\Src\ds18b20.c
.\objects\ds18b20.o: .\Module\Inc\ds18b20.h
.\objects\ds18b20.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\ds18b20.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\ds18b20.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\ds18b20.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\ds18b20.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\ds18b20.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\ds18b20.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\ds18b20.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\ds18b20.o: .\Module\Inc\common.h
.\objects\emergency_stop.o: Module\Src\emergency_stop.c
.\objects\emergency_stop.o: .\Module\Inc\emergency_stop.h
.\objects\emergency_stop.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\emergency_stop.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\emergency_stop.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\emergency_stop.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\emergency_stop.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\emergency_stop.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\emergency_stop.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\emergency_stop.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\emergency_stop.o: .\Module\Inc\uart_log.h
No preview for this file type
......@@ -7,5 +7,14 @@
.\objects\main.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\main.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\main.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\main.o: .\Module\Inc\rotate_motor.h
.\objects\main.o: .\Module\Inc\motor_common.h
.\objects\main.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
.\objects\main.o: .\Module\Inc\walking_motor.h
.\objects\main.o: .\Module\Inc\uart_log.h
.\objects\main.o: .\Module\Inc\common.h
.\objects\main.o: .\Module\Inc\buzzer.h
.\objects\main.o: .\Module\Inc\pneumatic_solenoid.h
.\objects\main.o: .\Module\Inc\temperature_sensor.h
.\objects\main.o: .\Module\Inc\ds18b20.h
.\objects\main.o: .\Module\Inc\parking_sensor.h
No preview for this file type
.\objects\onewire.o: Module\Src\onewire.c
.\objects\onewire.o: .\Module\Inc\onewire.h
.\objects\onewire.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\onewire.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\onewire.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\onewire.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\onewire.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\onewire.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\onewire.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\onewire.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\onewire.o: .\Module\Inc\common.h
.\objects\parking_sensor.o: Module\Src\parking_sensor.c
.\objects\parking_sensor.o: .\Module\Inc\parking_sensor.h
.\objects\parking_sensor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\parking_sensor.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\parking_sensor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\parking_sensor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\parking_sensor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\parking_sensor.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\parking_sensor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\parking_sensor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\parking_sensor.o: .\Module\Inc\common.h
.\objects\parking_sensor.o: .\Module\Inc\uart_log.h
.\objects\photoelectric_switch.o: Module\Src\photoelectric_switch.c
.\objects\photoelectric_switch.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\photoelectric_switch.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\photoelectric_switch.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\photoelectric_switch.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\photoelectric_switch.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\photoelectric_switch.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\photoelectric_switch.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\photoelectric_switch.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\photoelectric_switch.o: .\Module\Inc\photoelectric_switch.h
.\objects\photoelectric_switch.o: .\Module\Inc\uart_log.h
.\objects\pneumatic_solenoid.o: Module\Src\pneumatic_solenoid.c
.\objects\pneumatic_solenoid.o: .\Module\Inc\pneumatic_solenoid.h
.\objects\pneumatic_solenoid.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\pneumatic_solenoid.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\pneumatic_solenoid.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\pneumatic_solenoid.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\pneumatic_solenoid.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\pneumatic_solenoid.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\pneumatic_solenoid.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\pneumatic_solenoid.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\pneumatic_solenoid.o: .\Module\Inc\uart_log.h
.\objects\rotate_motor.o: Module\Src\rotate_motor.c
.\objects\rotate_motor.o: .\Module\Inc\rotate_motor.h
.\objects\rotate_motor.o: .\Module\Inc\motor_common.h
.\objects\rotate_motor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\rotate_motor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
.\objects\rotate_motor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\rotate_motor.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\rotate_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\rotate_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\rotate_motor.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\rotate_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\rotate_motor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\rotate_motor.o: .\Module\Inc\common.h
No preview for this file type
.\objects\step_motor.o: Module\Src\step_motor.c
.\objects\step_motor.o: .\Module\Inc\step_motor.h
.\objects\step_motor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\step_motor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
.\objects\step_motor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\step_motor.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\step_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\step_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\step_motor.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\step_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\step_motor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
No preview for this file type
.\objects\temperature_sensor.o: Module\Src\temperature_sensor.c
.\objects\temperature_sensor.o: .\Module\Inc\temperature_sensor.h
.\objects\temperature_sensor.o: .\Module\Inc\onewire.h
.\objects\temperature_sensor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\temperature_sensor.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\temperature_sensor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\temperature_sensor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\temperature_sensor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\temperature_sensor.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\temperature_sensor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\temperature_sensor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
.\objects\temperature_sensor.o: .\Module\Inc\uart_log.h
.\objects\temperature_sensor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stddef.h
No preview for this file type
No preview for this file type
.\objects\walking_motor.o: Module\Src\walking_motor.c
.\objects\walking_motor.o: .\Module\Inc\walking_motor.h
.\objects\walking_motor.o: .\Module\Inc\motor_common.h
.\objects\walking_motor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdint.h
.\objects\walking_motor.o: C:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
.\objects\walking_motor.o: .\Module\Inc\common.h
.\objects\walking_motor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\stm32f10x.h
.\objects\walking_motor.o: D:\嵌入式\mcu\Motor_Control\RTE\RTE_Components.h
.\objects\walking_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cm3.h
.\objects\walking_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmInstr.h
.\objects\walking_motor.o: C:\Keil_v5\ARM\CMSIS\Include\cmsis_armcc.h
.\objects\walking_motor.o: C:\Keil_v5\ARM\CMSIS\Include\core_cmFunc.h
.\objects\walking_motor.o: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\2.2.0\Device\Include\system_stm32f10x.h
#include "stm32f10x.h"
#include "step_motor.h"
#include "rotate_motor.h"
#include "walking_motor.h"
#include "uart_log.h"
#include "common.h"
#include "buzzer.h"
#include "pneumatic_solenoid.h"
#include "temperature_sensor.h"
#include "ds18b20.h"
#include "parking_sensor.h"
int main(void) {
// 初始化步进电机控制
StepperMotor_Init();
Total_GPIO_Init();
Total_EXTI_Init();
Serial_Init();
// 定义步进电机结构体
StepMotor motor = {
.stepcount = 0, // 初始步数
.direction = 1, // 初始方向(1:顺时针)
.curSpeed = 0, // 初始速度为0
.desSpeed = 0, // 目标速度
.maxSpeed = 9375, // 最大转速(假设值)
.speedStatus = SPEED_NONE, // 初始速度状态
.stepcountMode = 0, // 脉冲计数模式
.curlocation = 0, // 当前位置
.deslocation = 0, // 目标位置
.acceleration = 1000, // 加速度 (步/秒^2)
.deceleration = 1000, // 减速度 (步/秒^2)
.psc = 71, // 预分频器
.arr = 999 // 自动重装载寄存器
RotateMotor motor = {
.base={
.stepcount = 0, // 初始步数
.direction = 1, // 初始方向(1:顺时针)
.curSpeed = 0, // 初始速度为0
.desSpeed = 0, // 目标速度
.maxSpeed = 9375, // 最大转速(假设值)
.speedStatus = SPEED_NONE, // 初始速度状态
.stepcountMode =ABSOLUTE_COUNT, // 脉冲计数模式
.curlocation = 0, // 当前位置
.deslocation = 0, // 目标位置
.acceleration = 1000, // 加速度 (步/秒^2)
.deceleration = 1000, // 减速度 (步/秒^2)
.psc = 71, // 预分频器
.arr = 999 // 自动重装载寄存器
}
};
// 初始化定时器 TIM3
TIM3_Init(motor.psc, motor.arr);
TIM3_CH1_Init(motor.base.psc, motor.base.arr);
TIM3_CH2_Init(motor.base.psc, motor.base.arr);
SystemState currentState = STATE_IDLE;
// 设置初始方向(例如顺时针)
Set_Direction(motor.direction);
Rotate_SetDirection(motor.base.direction);
// 使能步进电机
Enable_Stepper(true);
Rotate_Enable_Rotate(true);
Walking_SetDirection(motor.base.direction);
// 使能或禁用旋转电机
Walking_Enable_Rotate(true);
Pneumatic_Solenoid_Control(0,1);
Buzzer_On();
// 配置 PE14 为推挽输出
Configure_PE_Pin(14, 0x3);
// 初始化 TIM2 捕获模式
TIM2_Capture_Init();
SendTriggerSignal();
//
// DS18B20_Init(); // 初始化 DS18B20
// uint32_t data=0;
// while (data<=0) {
// Serial_Printf("temperature = %02d\r\n\n",DS18B20_GetTemperture());
// data = DS18B20_GetTemperture() * 100;
// Serial_Printf("temperature = %d.%02d\r\n\n", data/100, data % 100);
//
// Delay(1000, 'm'); // 延时 1 秒
// }
;
// 主循环
while (1) {
StateMachineHandler(currentState);
Serial_Print("main: 启动\n");
// GPIOC->ODR |= (1 << 4); // 设置低电平
// Delay(2000); // 延时1秒
GPIOC->ODR &= ~(1 << 4); //设置高电平
// Delay(2000); // 延时1秒
// GPIOC->ODR |= (1 << 4); // 设置高电平
// Delay(2000); // 延时1秒
// GPIOC->ODR &= ~(1 << 4);
// Delay(2000); // 延时1秒
// GPIOC->ODR |= (1 << 4); // 设置高电平
// Delay(2000); // 延时1秒
// GPIOC->ODR &= ~(1 << 4);
// Delay(2000); // 延时1秒
// GPIOC->ODR |= (1 << 4); // 设置高电平
// Delay(2000); // 延时1秒
// 例子:加速到目标速度
Update_Motor_Status(&motor, SPEED_ACC, 9375, 1000); // 以1000 RPM/s的加速度加速到9375 RPM
// 保持匀速一段时间
Delay(5000); // 延时5秒
Delay(5000,'s'); // 延时5秒
// 例子:减速到停止
Update_Motor_Status(&motor, SPEED_DEC, 0, 1000); // 以1000 RPM/s的减速度减速到停止
// 保持停止一段时间
Delay(5000); // 延时5秒
Delay(5000,'s'); // 延时5秒
}
}
\ No newline at end of file
}
#include "stm32f10x.h"
#include "rotate_motor.h"
#include "walking_motor.h"
#include "uart_log.h"
#include "common.h"
#include "buzzer.h"
#include "pneumatic_solenoid.h"
#include "temperature_sensor.h"
#include "ds18b20.h"
#include "parking_sensor.h"
int main(void) {
Total_GPIO_Init();
Total_EXTI_Init();
Serial_Init();
// 定义步进电机结构体
RotateMotor motor = {
.base={
.stepcount = 0, // 初始步数
.direction = 1, // 初始方向(1:顺时针)
.curSpeed = 0, // 初始速度为0
.desSpeed = 0, // 目标速度
.maxSpeed = 9375, // 最大转速(假设值)
.speedStatus = SPEED_NONE, // 初始速度状态
.stepcountMode =ABSOLUTE_COUNT, // 脉冲计数模式
.curlocation = 0, // 当前位置
.deslocation = 0, // 目标位置
.acceleration = 1000, // 加速度 (步/秒^2)
.deceleration = 1000, // 减速度 (步/秒^2)
.psc = 71, // 预分频器
.arr = 999 // 自动重装载寄存器
}
};
// 初始化定时器 TIM3
TIM3_CH1_Init(motor.base.psc, motor.base.arr);
TIM3_CH2_Init(motor.base.psc, motor.base.arr);
SystemState currentState = STATE_IDLE;
// 设置初始方向(例如顺时针)
Rotate_SetDirection(motor.base.direction);
// 使能步进电机
Rotate_Enable_Rotate(true);
Walking_SetDirection(motor.base.direction);
// 使能或禁用旋转电机
Walking_Enable_Rotate(true);
Pneumatic_Solenoid_Control(0,1);
Buzzer_On();
Serial_Print("main: Before TIM2_Init\n");
TIM2_Init();
Serial_Print("main: Before Delay\n");
Delay(1000, 'm');
Serial_Print("main: Before Start_Measurement\n");
Start_Measurement(1 << 14);
Serial_Print("main: After Start_Measurement\n");
Serial_Print("main: DS18B20_Init\n");
// 初始化DS18B20
if (DS18B20_Init() == 0)
{
// 检测到DS18B20的情况可以进行一些处理,例如点亮一个LED
// 或者在开发板上的屏幕显示“DS18B20 Detected!”之类的信息
}
else
{
// 没有检测到DS18B20,可能需要给出错误处理
Serial_Printf("没有检测到DS18B20,可能需要给出错误处理");
}
uint32_t data = DS18B20_GetTemperture() * 100;
Serial_Printf("temperature = %d.%02d\r\n\n", data/100, data % 100);
// 主循环
while (1) {
StateMachineHandler(currentState);
Serial_Print("main: 启动\n");
// GPIOC->ODR |= (1 << 4); // 设置低电平
// Delay(2000); // 延时1秒
GPIOC->ODR &= ~(1 << 4); //设置高电平
// Delay(2000); // 延时1秒
// GPIOC->ODR |= (1 << 4); // 设置高电平
// Delay(2000); // 延时1秒
// GPIOC->ODR &= ~(1 << 4);
// Delay(2000); // 延时1秒
// GPIOC->ODR |= (1 << 4); // 设置高电平
// Delay(2000); // 延时1秒
// GPIOC->ODR &= ~(1 << 4);
// Delay(2000); // 延时1秒
// GPIOC->ODR |= (1 << 4); // 设置高电平
// Delay(2000); // 延时1秒
// 例子:加速到目标速度
Update_Motor_Status(&motor, SPEED_ACC, 9375, 1000); // 以1000 RPM/s的加速度加速到9375 RPM
// 保持匀速一段时间
Delay(5000,'s'); // 延时5秒
// 例子:减速到停止
Update_Motor_Status(&motor, SPEED_DEC, 0, 1000); // 以1000 RPM/s的减速度减速到停止
// 保持停止一段时间
Delay(5000,'s'); // 延时5秒
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment