基于 STM32F407,输出双路互补的 SPWM 波,AD 采集用 DMA DAC
的方式,具有 PID 调节
源程序如下:
#include "stm32f407.h"
#include "string.h"
#include "usart.h"
#include "delay.h"
#include "bsp_advance_tim.h"
#include "bsp_spwm.h"
#include "ShuangLu.h"
#include "PID.h"
#include "bsp_adc.h"
#include "SD_io.h"
#include "oled.h"
#include "filter.h"
#include "bsp_spwm.h"
#include "led.h"
#define current_threshold 3
//阈值电流为 3A
u8 DispADBuff[2][30];
//用于存放字符
extern u16 ADC_ConvertedValue[NOFCHANEL]; //DAC_DMA 传值处
extern PID pid_voltage;
//存放电压 PID 的参数
extern float ADC_Final_DisplayValue[NOFCHANEL]; //用于存放最
终显示值
extern 16 ADC_filter_Value[NOFCHANEL];
//用于存放滤波后值
extern u8 AD_Flag;
u32 Display_flag=0;
//是否显示,PID 是否更新
//初始化 LED 端口
int main(void)
{
delay_init(168);
ADC_X_Init();
TIMx_Configuration();
LED_Init();
OLED_Init();
PID_init(1,1,0,0.5);
OLED_ShowNum(0,0,22,3,16);
OLED_Display_On();
TIM3_Int_Init(3360-1,0);
while(1)
{
{
if(Display_flag%1000==0)
AD_Flag=AD_voltage;
ADC_filter_Value[0]=middleValueFilter();
AD_Flag=AD_current;
ADC_filter_Value[1]=middleValueFilter();
ADC_Final_DisplayValue[0]=(float)ADC_filter_Value[0]/409
6*3.3*6+0.2;
//电压检测
ADC_Final_DisplayValue[1] =(float)
ADC_filter_Value[1]/4096*3300*1.448-18;
//电流检测
//PID 电压计算输出,设定值 24V,输入电压检测值
PID_Calc(ADC_Final_DisplayValue[0],24,0.7,0.2);
//24 是
设定值,0.7 是上限.0.2 是下限
}
if((Display_flag>10000)||(Display_flag==1))
{
sprintf(DispADBuff[0],"V=%.2fV\0",ADC_Final_Display
Value[0]);//电压显示
sprintf(DispADBuff[1],"I1=%.3fA\0",ADC_Final_Displa
yValue[1]);//电流显示
OLED_ShowString(0,0,DispADBuff[0]);
OLED_ShowString(0,2,DispADBuff[1]);
OLED_Display_Off();
Display_flag=2;
}
if(ADC_Final_DisplayValue[1]>current_threshold)
{
GPIO_SetBits(SD_io_PORT,SD_io_I1|SD_io_I2);
delay_ms(1000);
pid_voltage.SEk=0;
GPIO_ResetBits(SD_io_PORT,SD_io_I1|SD_io_I2);
}
}
}