软件外包网站网站后台与前台
【测试】STM32F103C8T6 双极性SPWM单相全桥逆变带载(阻性)测试
🧠 请为这个项目建立一份模块结构图,并解释每个模块的职责。
 🧠 请列出这个项目中所有初始化流程的调用顺序。
 🧠 请总结一下项目的主控逻辑和控制流程。
我来帮您分析这个STM32项目的结构和逻辑。首先让我查看项目的主要文件来了解完整的架构。
 Read file: USER/main.c
 Read file: USER/main.h
 Search files…
 Read file: USER/main.c
 现在让我查看一些其他关键模块的头文件和定义:
 Read file: HARDWARE/TIMER/timer.h
 Read file: SYSTEM/usart/usart.h
 Read file: HARDWARE/ADC/adc.h
让我查看一下常用的宏定义来了解项目中的硬件控制接口:
 Ran tool
 现在我已经掌握了项目的整体结构。让我为您创建模块结构图并进行详细分析。
 Ran tool
项目模块结构分析
1. 各模块职责详解
系统初始化模块
- 延时模块(delay): 提供ms/us级别的精确延时功能
 - 系统配置(sys): 配置系统时钟、中断优先级分组、GPIO位操作宏定义
 - 串口通信(usart): 实现串口通信,支持printf调试输出和参数设置
 
硬件驱动模块
- 定时器模块(timer): 
TIM1: 生成20KHz的PWM载波,双通道互补输出带死区TIM2: SPWM波形更新中断,控制输出频率TIM3: 10ms*100 = 1秒定时中断,用于计时和显示刷新
 - ADC采样(adc): 双通道ADC采样,检测输入电压(PA1)和输出电流(PA2)
 - 按键输入(key): 4键输入,支持频率/幅值调节,包含IR2110使能控制
 - OLED显示(oled): I2C接口OLED屏幕显示系统状态
 - Flash存储(stmflash): 内部Flash读写,保存用户参数
 - LED控制(led): 状态指示LED控制
 
用户功能模块
- SPWM波形生成: 400点正弦查表,生成可调频率和幅值的正弦PWM
 - 频率/幅值控制: 频率范围2-200Hz,幅值可调0-输入电压峰值
 - 过流保护: 电流超过2A自动关断,低于0.12A延时5秒后恢复
 - 电压电流检测: 实时检测输入电压和输出电流,带滤波算法
 
2. 初始化流程调用顺序
根据main.c函数的初始化顺序:
int main(void) {// 1. 基础系统初始化delay_init();                           // 延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  // 中断优先级分组设置// 2. 硬件外设初始化KEY_Init();                             // 按键初始化Adc_Init();                             // ADC初始化uart1_init(9600);                       // 串口初始化// 3. 定时器初始化(关键)TIM2_Int_Init(100,48);                  // SPWM更新定时器(10KHz基准)getSinPlv(PlvTemp);                     // 根据频率设置TIM2周期getSinTab(400,VolTemp);                 // 生成正弦查表TIM3_Int_Init(100,4800);                // 1秒计时定时器TIM1_PWM_Init(1200,2);                  // PWM载波定时器(20KHz)// 4. 显示系统初始化OLED_Init();                            // OLED显示初始化OLED_Clear();                           // 清屏OLED_ShowString(...);                   // 显示初始界面// 5. 进入主循环while(1) { ... }
}
 
3. 主控逻辑和控制流程
主循环控制流程:
- 显示更新: 每1秒刷新一次OLED显示(
TimeCount1>1) - 按键扫描: 实时检测按键输入,调节频率和幅值
 - 串口命令: 处理串口接收的参数设置命令
 - 过流保护: 
- 电流>2A(ADC值>993): 立即关断输出
 - 电流<0.12A(ADC值<60): 延时5秒后恢复输出
 
 - 电压监测: 输入电压变化>2V时,重新计算PWM系数
 - 参数更新: 按键无操作2秒后,应用新的频率/幅值设置
 
SPWM生成原理:
- TIM1: 生成20KHz的PWM载波,双通道互补输出
 - TIM2: 根据输出频率设置中断周期,每次中断更新PWM占空比
 - 正弦查表: 400个点的正弦表,通过插值生成平滑的正弦波
 - 幅值控制: 根据输入电压动态计算1V对应的PWM值
 - 频率控制: 通过调整TIM2的中断周期实现频率调节
 
安全保护机制:
- 过流保护: 硬件电流检测+软件判断,双重保护
 - 死区设置: PWM输出带500ns死区,防止上下桥臂直通
 - 参数限制: 频率2-200Hz,幅值不超过输入电压
 - 滤波算法: 32点滑动平均滤波,提高检测精度
 
这是一个典型的SPWM逆变电源控制系统,采用模块化设计,具有完善的保护机制和用户交互界面。
🧠 “请结合代码分析SPWM生成相关的原理,解释各个变量和函数的功能,并说明各自在SPWM中的作用”
基于您提供的代码,我来深入分析SPWM(正弦脉宽调制)生成的原理和实现机制。
SPWM生成原理详解
1. 核心变量分析
SPWM波形生成相关变量
unsigned int  T_SinTable[500];    // 正弦波查找表,存储400个正弦波采样点
unsigned int  PWM_Index=0;        // SPWM查表索引,指向当前输出的波形点
uint8_t  Para=0;                  // 幅值系数,1V对应的PWM脉宽值
uint8_t  VolTemp=0;               // 用户设定的输出幅值(峰值电压)
uint16_t PlvTemp=50;              // 用户设定的输出频率,默认50Hz
 
控制和状态变量
int  Voltage=0;                   // 当前输入电压值(单位:0.1V)
int _voltage=0;                   // 输入电压暂存值,用于变化检测
uint16_t TimeCount2=0;            // 参数更新延时计数器
uint8_t  ShortFlag=0;             // 过流保护标志位
 
2. 关键函数功能分析
2.1 正弦波表生成函数 getSinTab()
 
void getSinTab(u16 point,u16 maxnum)
{u16 i=0; float x=0.000,y=0.000;   // 弧度float jiao=0.000;        // 角度分度角jiao=360.000/point;      // 计算每个采样点的角度间隔maxnum=maxnum*Para;      // 用户设定幅值 × 1V系数 = 实际PWM幅值if(maxnum>1188)          // 限制最大PWM值(考虑死区时间)maxnum=1188;if(maxnum>0){for(i=0;i<point;i++){y=jiao*i;                    // 当前点的角度x=y*0.01745;                 // 角度转弧度 (π/180≈0.01745)// 生成正弦波PWM值:中心值600 + 幅值×sin(角度)T_SinTable[i]=600+(maxnum/2)*sin(x);// 限幅处理if(T_SinTable[i]>1188) T_SinTable[i]=1188;if(T_SinTable[i]<1) T_SinTable[i]=1;}// 使能PWM输出if(ShortFlag==0){TIM_CtrlPWMOutputs(TIM1, ENABLE);ENA_Clr();   // 开启IR2110驱动}}else{ENA_Set();   // 关闭H桥TIM_CtrlPWMOutputs(TIM1, DISABLE);}
}
 
功能解析:
- point=400: 一个正弦周期采样400个点
 - maxnum: 用户设定的输出幅值
 - Para: 根据输入电压动态计算的幅值系数
 - 600: PWM的中心值(占空比50%)
 - 1188: 考虑死区时间的最大PWM值
 
2.2 频率控制函数 getSinPlv()
 
void getSinPlv(uint16_t plv)
{float cycle;unsigned int timeinit;cycle=2500/plv;              // 计算TIM2的中断周期timeinit=cycle;              // 浮点转整数TIM2_Int_Init(timeinit,48);  // 重新初始化TIM2定时器
}
 
频率计算原理:
- 基准频率: 48MHz/48 = 1MHz
 - 中断周期: 
timeinit微秒 - 输出频率: 
1000000/(timeinit×400)Hz - 公式推导: 
cycle = 2500/plv→freq = 1000000/(2500×400/plv) = plvHz 
2.3 幅值系数计算
Para = 1187/(Voltage/10);  // 计算1V对应的PWM脉宽值
 
计算逻辑:
- Voltage: 输入电压×10 (例如24V显示为240)
 - 1187: 最大可用PWM范围
 - Para: 每1V输出对应的PWM增量
 
3. SPWM更新机制
定时器中断服务函数 (timer.c)
void TIM2_IRQHandler(void)   // TIM2中断
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);// 翻转PC13引脚(调试用)GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_13))));// 更新PWM占空比TIM_SetCompare1(TIM1,T_SinTable[PWM_Index]);  // 通道1TIM_SetCompare2(TIM1,T_SinTable[PWM_Index]);  // 通道2// 索引循环if(++PWM_Index>=400)PWM_Index=0;}
}
 
4. SPWM生成流程图
5. 关键参数计算示例
50Hz正弦波输出计算:
- TIM2中断周期: 
2500/50 = 50微秒 - 完整周期时间: 
50μs × 400点 = 20ms = 50Hz✓ - TIM1载波频率: 
48MHz/2/1200 = 20KHz - 每个正弦点持续: 
50μs,包含20KHz×50μs = 1000个载波周期 
电压幅值计算(假设24V输入):
- 输入电压: 
Voltage = 240(24.0V) - 幅值系数: 
Para = 1187/(240/10) = 1187/24 ≈ 49 - 输出10V峰值: 
maxnum = 10×49 = 490 - 正弦波幅值: 
±490/2 = ±245(相对中心值600) 
6. SPWM技术优势
- 高频载波: 20KHz载波频率,滤波后得到平滑正弦波
 - 精确控制: 400点采样,0.9°角度分辨率
 - 动态调节: 实时调节频率(2-200Hz)和幅值
 - 死区保护: 500ns死区防止上下桥臂直通
 - 过流保护: 硬件+软件双重保护机制
 
这个SPWM实现方案采用查表法生成高精度正弦波,通过双定时器配合实现载波和调制波的精确控制,是一个典型的数字化逆变电源控制系统。
🧠用输入直流电压20V,输出频率50Hz,输出AC xx?推导整个过程,根据代码给出推导公式和计算过程。给出详细的计算过程和结果,给出计算过程的流程图。
基于您提供的代码,我来详细分析输入20V直流电压,输出50Hz时的完整计算过程。
计算前提和参数分析
1. 系统参数
- 输入电压: 20V直流
 - 输出频率: 50Hz
 - PWM载波频率: 20KHz
 - 正弦波采样点: 400点/周期
 - PWM计数范围: 0-1200
 - PWM中心值: 600 (50%占空比)
 
2. 关键计算公式推导
输入电压检测和处理
// 电压检测滤波
filter_buf[FILTER_N] = Get_Adc(1)*10.473;
Voltage=(Filter())/100;
 
计算过程:
输入20V → ADC采样 → 滤波处理 → Voltage = 200 (单位:0.1V)
 
幅值系数计算
Para=1187/(Voltage/10);  // 计算1V对应的PWM脉宽
 
推导公式:
Para = 1187 ÷ (Voltage ÷ 10)
Para = 1187 ÷ (200 ÷ 10) = 1187 ÷ 20 = 59.35 ≈ 59
 
3. 完整计算流程
4. 具体计算过程和代码对应
步骤1: 输入电压检测
void Get_Voltage()
{Voltage=(Filter())/100;  // 20V输入 → Voltage = 200
}
 
步骤2: 幅值系数计算
// 在主循环中
Para=1187/(Voltage/10);  // Para = 1187/20 = 59
 
步骤3: 用户设置输出幅值
假设用户通过按键设置输出15V峰值:
// 按键控制中
if(keytemp==3) // 幅值加
{if(VolTemp<(Voltage/10))  // 最大20VVolTemp++;           // VolTemp = 15
}
 
步骤4: 生成正弦波表
void getSinTab(u16 point,u16 maxnum)  // point=400, maxnum=15
{maxnum=maxnum*Para;  // maxnum = 15×59 = 885for(i=0;i<400;i++){y=jiao*i;        // 角度: 0°~359.1°x=y*0.01745;     // 转弧度// 生成正弦PWM值T_SinTable[i]=600+(885/2)*sin(x);  // 600 ± 442.5// 限幅处理if(T_SinTable[i]>1188) T_SinTable[i]=1188;if(T_SinTable[i]<1) T_SinTable[i]=1;}
}
 
步骤5: 频率控制
void getSinPlv(uint16_t plv)  // plv = 50Hz
{cycle=2500/plv;        // cycle = 2500/50 = 50timeinit=cycle;        // timeinit = 50μsTIM2_Int_Init(timeinit,48);  // 每50μs中断一次
}
 
5. 详细数值计算结果
输入条件: 20V直流,50Hz输出
| 参数 | 计算过程 | 结果 | 
|---|---|---|
| 输入电压检测 | Voltage = 20V × 10 = 200 | 200 (0.1V单位) | 
| 幅值系数 | Para = 1187 ÷ 20 = 59.35 | 59 | 
| TIM2中断周期 | cycle = 2500 ÷ 50 = 50 | 50μs | 
| 完整周期时间 | 50μs × 400点 = 20ms | 50Hz ✓ | 
不同输出幅值设置的结果:
情况1: VolTemp = 10V峰值
maxnum = 10 × 59 = 590
PWM幅值 = 590/2 = 295
PWM范围 = 600 ± 295 = [305, 895]
占空比范围 = [25.4%, 74.6%]
 
情况2: VolTemp = 15V峰值
maxnum = 15 × 59 = 885  
PWM幅值 = 885/2 = 442.5
PWM范围 = 600 ± 442.5 = [157.5, 1042.5]
占空比范围 = [13.1%, 86.9%]
 
情况3: VolTemp = 20V峰值(最大)
maxnum = 20 × 59 = 1180
限制后 maxnum = 1180 (未超过1188)
PWM幅值 = 1180/2 = 590
PWM范围 = 600 ± 590 = [10, 1190]
占空比范围 = [0.8%, 99.2%]
 
6. 输出电压计算
理论输出电压(RMS值):
峰值电压 = VolTemp (用户设置)
RMS电压 = 峰值电压 ÷ √2 ≈ 峰值电压 × 0.707例如: VolTemp = 15V峰值
输出RMS = 15V × 0.707 = 10.6V RMS
 
7. 代码执行时序
8. 最终答案
对于输入20V直流,输出50Hz的设置:
-  
系统自动计算的参数:
- 电压检测值: 
Voltage = 200 - 幅值系数: 
Para = 59 - 频率控制: 每50μs更新一次PWM
 
 - 电压检测值: 
 -  
用户可设置的输出电压范围:
- 最小: 0V峰值 (关闭输出)
 - 最大: 20V峰值 (输入电压)
 - 步进: 1V
 
 -  
典型设置示例(15V峰值):
- 输出峰值: 15V
 - 输出RMS: 10.6V
 - PWM占空比范围: 13.1% ~ 86.9%
 - 输出频率: 50Hz (精确)
 
 
关键结论: 输出AC电压完全由用户通过VolTemp参数控制,可在0~20V峰值范围内任意设置,系统会自动根据输入电压计算对应的PWM参数,确保输出电压的准确性。
