#include "stm32f10x.h"
#include "stm32f10x_adc.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "math.h"
// PID参数结构体
typedef struct {
float Kp;
float Ki;
float Kd;
float integral_limit;
float output_limit;
float integral;
float prev_error;
} PID_Controller;
// 系统参数
#define PWM_PERIOD 999 // PWM周期 (ARR值)
#define V_REF 24.0f // 目标输出电压 (24V)
#define MAX_DUTY 0.85f // 最大占空比限制
#define MIN_DUTY 0.05f // 最小占空比限制
// ADC采样值
volatile uint16_t adc_voltage = 0; // 输出电压采样
volatile uint16_t adc_current = 0; // 电感电流采样
// PID控制器实例
PID_Controller voltage_pid = {0.5, 0.01, 0.0, 100.0, 5.0, 0, 0}; // 电压环PID
PID_Controller current_pid = {0.8, 0.05, 0.01, 50.0, 3.0, 0, 0}; // 电流环PID
// 函数声明
void GPIO_Configuration(void);
void ADC_Configuration(void);
void TIM_Configuration(void);
void NVIC_Configuration(void);
void PID_Init(PID_Controller *pid, float kp, float ki, float kd, float int_limit, float out_limit);
float PID_Update(PID_Controller *pid, float setpoint, float measurement);
float Map_ADC_To_Voltage(uint16_t adc_value);
float Map_ADC_To_Current(uint16_t adc_value);
int main(void) {
// 系统初始化
SystemInit();
GPIO_Configuration();
ADC_Configuration();
TIM_Configuration();
NVIC_Configuration();
// PID初始化
PID_Init(&voltage_pid, voltage_pid.Kp, voltage_pid.Ki, voltage_pid.Kd,
voltage_pid.integral_limit, voltage_pid.output_limit);
PID_Init(¤t_pid, current_pid.Kp, current_pid.Ki, current_pid.Kd,
current_pid.integral_limit, current_pid.output_limit);
// 启动ADC和定时器
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
while (1) {
// 主循环中可添加监控或通信功能
// 控制算法在定时器中断中执行
}
}
// PID初始化函数
void PID_Init(PID_Controller *pid, float kp, float ki, float kd, float int_limit, float out_limit) {
pid->Kp = kp;
pid->Ki = ki;
pid->Kd = kd;
pid->integral_limit = int_limit;
pid->output_limit = out_limit;
pid->integral = 0;
pid->prev_error = 0;
}
// PID更新函数
float PID_Update(PID_Controller *pid, float setpoint, float measurement) {
float error = setpoint - measurement;
// 积分项更新
pid->integral += error;
// 积分限幅
if (pid->integral > pid->integral_limit) pid->integral = pid->integral_limit;
if (pid->integral < -pid->integral_limit) pid->integral = -pid->integral_limit;
// 微分项计算
float derivative = error - pid->prev_error;
pid->prev_error = error;
// PID输出
float output = pid->Kp * error +
pid->Ki * pid->integral +
pid->Kd * derivative;
// 输出限幅
if (output > pid->output_limit) output = pid->output_limit;
if (output < -pid->output_limit) output = -pid->output_limit;
return output;
}
// 电压ADC值转实际电压 (假设12位ADC, 分压比10:1, 参考电压3.3V)
float Map_ADC_To_Voltage(uint16_t adc_value) {
return (adc_value * 3.3f / 4096) * 11.0f; // 分压比计算
}
// 电流ADC值转实际电流 (假设采样电阻0.1Ω, 放大倍数20)
float Map_ADC_To_Current(uint16_t adc_value) {
return (adc_value * 3.3f / 4096) / 0.1f / 20.0f;
}
// 定时器3中断服务函数 (控制周期)
void TIM3_IRQHandler(void) {
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
// 读取ADC值
float output_voltage = Map_ADC_To_Voltage(adc_voltage);
float inductor_current = Map_ADC_To_Current(adc_current);
// 电压外环计算电流参考
float current_ref = PID_Update(&voltage_pid, V_REF, output_voltage);
// 电流内环计算占空比
float duty_cycle = PID_Update(¤t_pid, current_ref, inductor_current);
// 占空比限幅
if (duty_cycle > MAX_DUTY) duty_cycle = MAX_DUTY;
if (duty_cycle < MIN_DUTY) duty_cycle = MIN_DUTY;
// 更新PWM占空比
TIM_SetCompare1(TIM1, (uint16_t)(duty_cycle * PWM_PERIOD));
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
// ADC中断服务函数
void ADC1_2_IRQHandler(void) {
if (ADC_GetITStatus(ADC1, ADC_IT_JEOC) == SET) {
// 读取注入通道采样值
adc_voltage = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);
adc_current = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2);
ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);
}
}
// 外设配置函数
void GPIO_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
// PWM输出引脚 (TIM1 CH1 - PA8)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// ADC输入引脚 (电压采样 - PA1, 电流采样 - PA2)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM_Configuration(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// PWM定时器配置 (TIM1 - 20kHz)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD;
TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock / 20000000 - 1; // 72MHz->20kHz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
// PWM通道配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
// 控制周期定时器 (TIM3 - 10kHz)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = SystemCoreClock / 10000 - 1; // 10kHz
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);
}
void ADC_Configuration(void) {
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// ADC基本配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_Init(ADC1, &ADC_InitStructure);
// 配置注入通道 (电压:通道1, 电流:通道2)
ADC_InjectedSequencerLengthConfig(ADC1, 2);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5);
ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_28Cycles5);
// 使能注入通道转换结束中断
ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);
// 定时器触发ADC采样 (TIM3触发)
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T3_TRGO);
ADC_Cmd(ADC1, ENABLE);
// ADC校准
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
void NVIC_Configuration(void) {
NVIC_InitTypeDef NVIC_InitStructure;
// 配置ADC中断
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 配置TIM3中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
}
第 218 行提示 error: use of undeclared identifier 'ADC
ExternalTrigInjecConv T3 TRGO 改掉错误,然后给我完整代码