国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

單相逆變電路實戰(zhàn)!(基于STM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)

這篇具有很好參考價值的文章主要介紹了單相逆變電路實戰(zhàn)!(基于STM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔


我建了一個群,分享我個人做項目的經(jīng)歷和資源,純個人愛好,一切免費,看自己空閑時間答疑,有想法的可以加QQ群280730348

前言

本篇文章是對單相逆變電路進(jìn)行實戰(zhàn)演練的一次項目,主要實現(xiàn)功能為:

直流電壓48V輸入,通過STM32F103C8T6單片機(jī)輸出SPWM波,通過IR2104S驅(qū)動模塊控制兩組對管的開關(guān)閉合,通過LCL濾波實現(xiàn)工頻正弦波的平滑輸出。額定輸出電壓為24V,額定輸出電流為2A,額定輸出功率為48W,適合對逆變電路感興趣的朋友實戰(zhàn)演練。

實物圖如下:
單相逆變電路實戰(zhàn)!(基于STM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)


一、所需要的主要器件

1、STM32F103C8T6開發(fā)板一塊
2、0.96寸OLED屏幕一塊
3、IRF540N(MOSFET管)四個
4、1mh鐵鋁硅電感33MM
5、MKP電容10uf(圓柱形)
6、兩個IR2104驅(qū)動模塊
7、交流電計量模塊HLW8032

二、硬件電路圖

1.單相逆變主電路

單相逆變電路實戰(zhàn)!(基于STM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)
主要原理為:HO3、LO3為IR2104S驅(qū)動模塊1驅(qū)動,HO2、LO2為IR2104S驅(qū)動模塊2驅(qū)動。在任一瞬間,HO3和LO3波形相反,HO2與LO2波形相反,且HO3和HO2波形相反。即整體電路只對應(yīng)兩種工作狀態(tài):

第一種工作狀態(tài)為:直流電流通過Q1mos管流經(jīng)L6,負(fù)載L3再流經(jīng)Q4最終到達(dá)地,在這一工作狀態(tài)里,若負(fù)載上端視為電壓正極,則負(fù)載上會加上一個正向的電壓,也即處于正弦波的正半周期。

第二種工作狀態(tài)為:直流電流通過Q3mos管流經(jīng)L3,負(fù)載L6再流經(jīng)Q2最終到達(dá)地,在這一工作狀態(tài)里,若負(fù)載上端視為電壓正極,則負(fù)載上會加上一個反向的電壓,也即處于正弦波的負(fù)半周期。

2.繼電器過流過壓保護(hù)

單相逆變電路實戰(zhàn)?。ɑ赟TM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)
CTRL為單片機(jī)控制繼電器開關(guān)閉合的信號,I+和I-分別連至逆變電路的輸出和負(fù)載的上端。若CTRL給低電平,9013關(guān)閉,繼電器磁鐵不吸合,I+和I-處于連接狀態(tài)。若CTRL給高電平,則9013導(dǎo)通,繼電器磁鐵吸合,I-和FLOAT處于連接狀態(tài),電路輸出浮空,起到保護(hù)作用。

3.輔助電源供電

單相逆變電路實戰(zhàn)!(基于STM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)
12V電源適配器輸入,通過7805降壓至5V,給單片機(jī)和總體供電。

4.IR2104驅(qū)動

單相逆變電路實戰(zhàn)!(基于STM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)

芯片輸入口主要有四個信號,一個是12V的供電信號,一個是PWM的驅(qū)動信號,一個是5V的芯片使能信號,另外一個是數(shù)字地。輸出口同樣有四個信號,分別為HO,VS,LO和模擬地。本驅(qū)動的功能是,輸入一路PWM信號,在HO和LO口得到互補(bǔ)的PWM波,VS接在對管MOSFET的中間,即上管的S端和下管的D端,利用自舉驅(qū)動原理驅(qū)動上管開關(guān)閉合。

三、軟件流程圖

1.Visio流程圖

單相逆變電路實戰(zhàn)?。ɑ赟TM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)

2.主函數(shù)

代碼如下(示例):

/*
STM32F103C8T6
iic通信0.96寸OLED顯示屏;顯示中英文、數(shù)字、圖片
18B20溫度傳感器
HC-SR04超聲波傳感器

OLED接線定義:
					VCC--3.3V/5V
					GND--GND
					SCL--PB8
					SDA--PB9
*/
#include "stm32f10x.h"
#include <stdbool.h>
#include "string.h"
#include "sys.h"  
#include "delay.h"
#include "oled.h"
#include "stdio.h"
#include "timer.h"
#include "usart.h"
#include "usart2.h"
#include "led.h"
#include "show.h"
#include "main.h"
#include "pid.h"
#include "key.h"
float jiaozheng=1.0023f;
/*電能數(shù)據(jù)采集參量設(shè)置*/            
extern u32 Voltage_Parameter_Reg,Voltage_Reg,Current_Reg,Current_Parameter_Reg,Power_Parameter_Reg,Power_Reg;
extern u8 Data_Updata_Reg;
extern u16 PF_Reg;
float ACVotage,ACCurrent,ActivePower,ApparentPower,PowerFactor,ElectricEnergy;
u8 Pre_Data_Updata_Reg;
u16 UpdataCount;
u32 PFCount,PF_OneDegree;
u8 buf[5]={11,12,12,12,12};
/*實際電路運行中需要用到的一些電路參數(shù)*/
u8 gonglv_status=1;                     //功率狀態(tài)標(biāo)志位,為1時是額定48W輸出,為2時是額定24W輸出,為3時是額定12W輸出
u8 dianya_status=1;                     //電壓狀態(tài)標(biāo)志位,為1時是調(diào)節(jié)整數(shù)位輸出,為2時是調(diào)節(jié)小數(shù)位輸出
u8 work_mode=0;                         //工作模式為0,代表啟動界面;工作模式為1,代表模式選擇界面;
u8 mode_status=1;                       //=1代表指向額定電壓輸出,=2代表指向額定功率輸出,=3代表指向初始啟動界面
u8 key_value=0;                         //按鍵鍵值,1-4分別代表control,choice,add,reduce
float duty=1000.0f;                     //逆變電路的調(diào)制系數(shù)
float AC_Target=240.0f;                 //逆變電路輸出目標(biāo)值
float gonglv_Target=232.0f;             //功率追蹤位
float PID_flag=0;                       //PID使能控制位
float kp_v=0.04;                          //P環(huán)調(diào)節(jié)系數(shù)
float kp_p=0.04;
float dianzu=11.20f; 
/*第一次進(jìn)入界面使能*/
u8 mode_1=0;
u8 mode_2=0;
u8 mode_3=0;
u8 mode_4=0;
int main(void)
{	
    u16 i=0;
    u8 x=0,y=0;	
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級 		 		
	delay_init();           //延時
	uart_init(9600);        //串口初始化
	uart2_init(4800);	 	//串口初始化為115200
	TIM3_Int_Init(3600-1,1-1);//10KHZ
	TIM4_Int_Init(3600-1,2-1);//10KHZ
	BOOST_PWM_Init();
	LED_Init();             //LED初始化
	KEY_Init();
	init_PID();             //初始化PID參數(shù)
	OLED_Init();			//初始化OLED  
	OLED_Clear();
	loop:
    GPIO_SetBits(GPIOB,GPIO_Pin_5);		//關(guān)閉繼電器
	qidong_view(); 		
	TIM_Cmd(TIM1,DISABLE);
	PID_flag=0;
	duty=0;
	AC_Target=240.0f;
	while(1)
	{
	    key_value=KEY_Scan(0);
		if(key_value==1)
		{
		   work_mode=1;
		   TIM_Cmd(TIM1,ENABLE);
		   GPIO_ResetBits(GPIOB,GPIO_Pin_5);
		   for(i=1;i<=1000;i++)
		  {
			  duty=i;
			  delay_ms(1);
		  }
           break;			
		}
	}
	choice_view();
	while(1)
	{
		key_value=KEY_Scan(0);//掃描鍵值
		/*選擇初始界面函數(shù)*/
		if(work_mode==0)
		{			
			goto loop;
		}
		/*選擇界面處理函數(shù)*/
        else if(work_mode==1)
		{
			if(mode_1==0)choice_view(),mode_1=1,PID_flag=0,duty=600;
			if(key_value==2)
			{
				mode_status+=1;
				if(mode_status==4)
				{
					mode_status=1;
				}
			}
			else if(key_value==1)
			{
				mode_1=0;
				if(mode_status==1)work_mode=2;
				else if(mode_status==2)work_mode=3;
				else if(mode_status==3)work_mode=0;
			}
			if(mode_status==1)
			{
				OLED_ShowString(90,2,"<-",16);
				OLED_ShowString(90,4,"  ",16);
				OLED_ShowString(90,6,"  ",16);
			}
			else if(mode_status==2)
			{
				OLED_ShowString(90,2,"  ",16);
				OLED_ShowString(90,4,"<-",16);
				OLED_ShowString(90,6,"  ",16);
			}
			else if(mode_status==3)
			{
				OLED_ShowString(90,2,"  ",16);
				OLED_ShowString(90,4,"  ",16);
				OLED_ShowString(90,6,"<-",16);
			}
		}
		/*選擇電壓界面處理函數(shù)*/
		else if(work_mode==2)
		{
			if(mode_2==0)dianya_view(),mode_2=1;
			if(key_value==2)
			{
				dianya_status+=1;
				if(dianya_status==3)
				{
					dianya_status=1;
				}
			}
			else if(key_value==1)
			{
				mode_2=0;
				PID_flag=1;
				work_mode=4;				
			}
			else if(key_value==4&&dianya_status==1)
			{
				AC_Target+=10;
			}
			else if(key_value==4&&dianya_status==2)
			{
				AC_Target+=1;
			}
			else if(key_value==3&&dianya_status==1)
			{
				AC_Target-=10;
			}
			else if(key_value==3&&dianya_status==2)
			{
				AC_Target-=1;
			}
			if(dianya_status==1)
			{
				OLED_ShowString(90,2,"<-",16);
				OLED_ShowString(90,4,"  ",16);
			}
			else if(dianya_status==2)
			{
				OLED_ShowString(90,2,"  ",16);
				OLED_ShowString(90,4,"<-",16);
			}
		    OLED_ShowNum(56,2,(int)AC_Target/10,2,16);
	        OLED_ShowNum(56,4,(int)AC_Target%10,1,16);
			OLED_ShowNum(56,6,(int)AC_Target/10,2,16);OLED_ShowNum(80,6,(int)AC_Target%10,1,16);
		}
		/*選擇功率界面處理函數(shù)*/
		else if(work_mode==3)
		{
			if(mode_3==0)gonglv_view(),mode_3=1;
			if(key_value==2)
			{
				gonglv_status+=1;
//				if(gonglv_status==3)
//				{
//					gonglv_status=1;
//				}
				if(gonglv_status==4)
				{
					gonglv_status=1;
				}
			}
			else if(key_value==1)
			{
				mode_3=0;
				PID_flag=1;
				work_mode=4;
                if(gonglv_status==1)gonglv_Target=232.0f;
                else if(gonglv_status==2)gonglv_Target=164.0f;
                else if(gonglv_status==3)gonglv_Target=116.0f;				
			}
//			else if(key_value==4&&gonglv_status==1)
//			{
//				gonglv_Target+=10;
//			}
//			else if(key_value==4&&gonglv_status==2)
//			{
//				gonglv_Target+=1;
//			}
//			else if(key_value==3&&gonglv_status==1)
//			{
//				gonglv_Target-=10;
//			}
//			else if(key_value==3&&gonglv_status==2)
//			{
//				gonglv_Target-=1;
//			}
//			if(gonglv_status==1)
//			{
//				OLED_ShowString(90,2,"<-",16);
//				OLED_ShowString(90,4,"  ",16);
//			}
//			else if(gonglv_status==2)
//			{
//				OLED_ShowString(90,2,"  ",16);
//				OLED_ShowString(90,4,"<-",16);
//			}
//			OLED_ShowNum(56,2,(int)gonglv_Target/10,2,16);
//	        OLED_ShowNum(56,4,(int)gonglv_Target%10,1,16);
//			OLED_ShowNum(56,6,(int)gonglv_Target/10,2,16);OLED_ShowNum(80,6,(int)gonglv_Target%10,1,16);
			if(gonglv_status==1)
			{
				OLED_ShowString(90,2,"<-",16);
				OLED_ShowString(90,4,"  ",16);
				OLED_ShowString(90,6,"  ",16);
			}
			else if(gonglv_status==2)
			{
				OLED_ShowString(90,2,"  ",16);
				OLED_ShowString(90,4,"<-",16);
				OLED_ShowString(90,6,"  ",16);
			}
			else if(gonglv_status==3)
			{
				OLED_ShowString(90,2,"  ",16);
				OLED_ShowString(90,4,"  ",16);
				OLED_ShowString(90,6,"<-",16);
			}
		}
		/*參數(shù)選擇界面*/
		else if(work_mode==4)
		{
			if(mode_4==0)canshu_view(),mode_4=1;
			if(key_value==1)
			{
				mode_4=0;
				PID_flag=0;
				work_mode=1;			
			}
				/*顯示電壓電流數(shù)據(jù)*/
	        OLED_ShowNum(40,0,(u32)(ACVotage*100)/100,2,16);
	        OLED_ShowNum(64,0,(u32)(ACVotage*100)%100,2,16);
	        OLED_ShowNum(40,2,(u32)(ACCurrent*100)/100,2,16);
	        OLED_ShowNum(64,2,(u32)(ACCurrent*100)%100,2,16);
	        OLED_ShowNum(40,4,(u32)(ApparentPower*10)/10,3,16);
	        OLED_ShowNum(72,4,(u32)(ApparentPower*10)%10,1,16);
		}
        ACVotage=(Voltage_Parameter_Reg*1.88/Voltage_Reg)*jiaozheng;//電壓有效值
		if(ACVotage<=2)
		 ACVotage=0;
		ACCurrent=(Current_Parameter_Reg*1.0/Current_Reg)*0.4893;//電流有效值
		if(ACCurrent<0.1)//無電壓時電壓又飄移
		{
			ACCurrent=0;
			ApparentPower=0;
			ActivePower=0;
			PowerFactor=0;
		}
		if(ACVotage>2&&ACCurrent>0.1)//空載時電流有飄移
		{
		
		
			ApparentPower=ACVotage*ACCurrent;//視在功率
			ActivePower=Power_Parameter_Reg*1.88/Power_Reg;//有功功率
			PowerFactor=ActivePower/ApparentPower;//功率因數(shù)
		}
        printf ("電壓有效值:%f\r\n",ACVotage);
		printf ("電流有效值:%f\r\n",ACCurrent);
        printf ("視在功率:%f\r\n",ApparentPower);
		printf ("有功功率:%f\r\n",ActivePower);
		printf ("功率因數(shù):%f\r\n",PowerFactor);
		if(Pre_Data_Updata_Reg!=(Data_Updata_Reg&0x80))
		{
			UpdataCount++;
			Pre_Data_Updata_Reg=Data_Updata_Reg&0x80;
		}
		PFCount=UpdataCount*65536+PF_Reg;//脈沖信號個數(shù)
		PF_OneDegree=1000000000/Power_Parameter_Reg;
		PF_OneDegree=PF_OneDegree*3600/1.88;//1度電對應(yīng)的脈沖個數(shù);
		ElectricEnergy=(float)PFCount/(float)PF_OneDegree;//電能
		printf ("電能:%f\r\n",ElectricEnergy);
		delay_ms(50);		
	}

主代碼里面主要是對于界面的顯示和模式的切換,以及處理交流電壓和交流電流等參數(shù)數(shù)據(jù)。

3.定時器中斷函數(shù)

#include "timer.h"
#include "inverter.h"
#include "main.h"
#include "pid.h"
#include "usart.h"
#include "string.h" 
	 
#define BOOST_TIMx TIM1
#define BOOST_Plus 0//初始化占空比為0.5%,高電平有效時的低電平占空比 
#define BOOST_ARR (3600-1)//重裝載值1000
#define BOOST_PSC (1-1)//分頻系數(shù)2
void BOOST_PWM_Init(void)//boost電路輸出互補(bǔ)PWM波形(PA8、PB13)
{   
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
	TIM_OCInitTypeDef TIM_OCInitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能PORTA,B時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	//初始化GPIO,PA8
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//端口復(fù)用
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure); //PA8
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
	GPIO_Init(GPIOB,&GPIO_InitStructure);//PB13
		
	//初始化時具單元
	TIM_DeInit(BOOST_TIMx);
	
	TIM_TimeBaseInitStruct.TIM_ClockDivision=0;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period=BOOST_ARR;
	TIM_TimeBaseInitStruct.TIM_Prescaler=BOOST_PSC;
	TIM_TimeBaseInit(BOOST_TIMx,&TIM_TimeBaseInitStruct);
	
	//將輸出通道2初始化為PWM模式1
	
	TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
	TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_High;
	TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
	TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
	TIM_OCInitStruct.TIM_Pulse=BOOST_Plus;
	TIM_OC1Init(BOOST_TIMx,&TIM_OCInitStruct);
	//使能預(yù)裝載寄存器
	TIM_OC1PreloadConfig(BOOST_TIMx,TIM_OCPreload_Enable);
	
	//死區(qū)和剎車功能配置
	
	TIM_BDTRInitStruct.TIM_OSSIState=TIM_OSSIState_Disable;
	TIM_BDTRInitStruct.TIM_OSSRState=TIM_OSSRState_Disable;
	TIM_BDTRInitStruct.TIM_LOCKLevel=TIM_LOCKLevel_1;
	TIM_BDTRInitStruct.TIM_DeadTime=0; //40.92ns
	TIM_BDTRInitStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;
	TIM_BDTRInitStruct.TIM_Break=TIM_Break_Disable;
	TIM_BDTRInitStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
	TIM_BDTRConfig(BOOST_TIMx,&TIM_BDTRInitStruct);
	
	//使能自動重裝載
	TIM_ARRPreloadConfig(BOOST_TIMx,ENABLE);
	
	//開啟定時器
	TIM_Cmd(BOOST_TIMx,DISABLE);
	
	//主輸出使能
	TIM_CtrlPWMOutputs(BOOST_TIMx,ENABLE);
}
//定時器7中斷服務(wù)程序		    
void TIM2_IRQHandler(void)
{ 	
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//是更新中斷
	{	 			   
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIM7更新中斷標(biāo)志    
		TIM_Cmd(TIM2, DISABLE);  //關(guān)閉TIM7 
	}	    
}
 	 
void TIM2_Int_Init(u16 arr,u16 psc)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//TIM7時鐘使能    
	
	//定時器TIM7初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位
 
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //使能指定的TIM7中斷,允許更新中斷
	
	TIM_Cmd(TIM2,ENABLE);//開啟定時器7
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//搶占優(yōu)先級0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		//子優(yōu)先級2
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器
	
}
void TIM3_IRQHandler(void)
{ 	
	static u16 jishu=0;
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中斷
	{	
        inverter_spwm();
		if(jishu==400)
		{
		  jishu=0;
          if(PID_flag==1)
		  {
             if(mode_status==1)duty=PID_X(ACVotage*10,AC_Target,kp_v,2,1200);
		     else if(mode_status==2)duty=PID_X(ACVotage*10,gonglv_Target,kp_p,2,1200); 
             //else if(mode_status==2)duty=PID_X(ACVotage*10,sqrt((gonglv_Target/10)*11.2)*10,kp_p,2,1200);			  
          }
	    }
		jishu++;
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIM7更新中斷標(biāo)志    
	}	    
}
 	 
void TIM3_Int_Init(u16 arr,u16 psc)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//TIM3時鐘使能    
	
	//定時器TIM7初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷
	
	TIM_Cmd(TIM3,ENABLE);//開啟定時器3
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//搶占優(yōu)先級0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器
	
}
 void TIM4_IRQHandler(void)
{ 	
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)//是更新中斷
	{	
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIM7更新中斷標(biāo)志    
	}	    
}
void TIM4_Int_Init(u16 arr,u16 psc)
{	
	NVIC_InitTypeDef NVIC_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//TIM3時鐘使能    
	
	//定時器TIM7初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數(shù)模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據(jù)指定的參數(shù)初始化TIMx的時間基數(shù)單位
 
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM3中斷,允許更新中斷
	
	TIM_Cmd(TIM4,ENABLE);//開啟定時器3
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//搶占優(yōu)先級0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器
	
}
 /*選擇通道函數(shù)*/
void set_pwm(TIM_TypeDef* TIMx,u8 chx,u16 prec,u16 up)
{
	//判斷輸入?yún)?shù)是否正確
	if(chx<1||chx>4)
		return;
	if(prec>up)
		prec=up;
	//根據(jù)輸入的通道設(shè)置PWM占空比
	switch(chx)
	{
		case 1:TIM_SetCompare1(TIMx,prec);break;
		case 2:TIM_SetCompare2(TIMx,prec);break;     
		case 3:TIM_SetCompare3(TIMx,prec);break;
		case 4:TIM_SetCompare4(TIMx,prec);break;           
	}
}

定時器一主要是用來輸出互補(bǔ)的PWM波,定時器二和定時器四無明顯作用,定時器三主要是控制SPWM波的生成以及進(jìn)行PID運算。定時器三時鐘頻率為20KHz,在其中斷里面定義了一個暫態(tài)變量,每進(jìn)入400次中斷循環(huán)復(fù)位一次,這樣沒執(zhí)行一次中斷改變一次PWM的占空比,即可實現(xiàn)SPWM波的生成。PID由于我們的信號采集模塊每隔50ms發(fā)一次數(shù)據(jù),所以選擇50Hz的頻率進(jìn)行一次PID的運算。

4.逆變器SPWM函數(shù)

#include "inverter.h"
#include "timer.h"
#include "main.h"
#define length 400

u16 sinData[length]=
{
1800,1821,1842,1864,1885,1906,1927,1949,1970,1991,2012,2033,2054,2075,2096,2117,
2137,2158,2179,2199,2219,2240,2260,2280,2300,2320,2339,2359,2378,2397,2416,2435,
2454,2473,2491,2510,2528,2546,2563,2581,2598,2615,2632,2649,2666,2682,2698,2714,
2730,2745,2760,2775,2790,2805,2819,2833,2847,2860,2873,2886,2899,2911,2924,2935,
2947,2958,2969,2980,2990,3001,3010,3020,3029,3038,3047,3055,3063,3071,3078,3085,
3092,3098,3105,3110,3116,3121,3126,3130,3134,3138,3142,3145,3148,3150,3152,3154,
3156,3157,3158,3158,3159,3158,3158,3157,3156,3154,3152,3150,3148,3145,3142,3138,
3134,3130,3126,3121,3116,3110,3105,3098,3092,3085,3078,3071,3063,3055,3047,3038,
3029,3020,3010,3001,2990,2980,2969,2958,2947,2935,2924,2911,2899,2886,2873,2860,
2847,2833,2819,2805,2790,2775,2760,2745,2730,2714,2698,2682,2666,2649,2632,2615,
2598,2581,2563,2546,2528,2510,2491,2473,2454,2435,2416,2397,2378,2359,2339,2320,
2300,2280,2260,2240,2219,2199,2179,2158,2137,2117,2096,2075,2054,2033,2012,1991,
1970,1949,1927,1906,1885,1864,1842,1821,1800,1778,1757,1735,1714,1693,1672,1650,
1629,1608,1587,1566,1545,1524,1503,1482,1462,1441,1420,1400,1380,1359,1339,1319,
1299,1279,1260,1240,1221,1202,1183,1164,1145,1126,1108,1089,1071,1053,1036,1018,
1001,984,967,950,933,917,901,885,869,854,839,824,809,794,780,766,
752,739,726,713,700,688,675,664,652,641,630,619,609,598,589,579,
570,561,552,544,536,528,521,514,507,501,494,489,483,478,473,469,
465,461,457,454,451,449,447,445,443,442,441,441,441,441,441,442,
443,445,447,449,451,454,457,461,465,469,473,478,483,489,494,501,
507,514,521,528,536,544,552,561,570,579,589,598,609,619,630,641,
652,664,675,688,700,713,726,739,752,766,780,794,809,824,839,854,
869,885,901,917,933,950,967,984,1001,1018,1036,1053,1071,1089,1108,1126,
1145,1164,1183,1202,1221,1240,1260,1279,1299,1319,1339,1359,1380,1400,1420,1441,
1462,1482,1503,1524,1545,1566,1587,1608,1629,1650,1672,1693,1714,1735,1757,1778
};

void inverter_spwm(void)
{
  static u16 spwm_count=0;
  set_pwm(TIM1,1,(u16)((sinData[spwm_count%length]-1800)*duty/1000+1800),3500);	
  spwm_count++;
  if(spwm_count>=400)spwm_count=0;	  
}

如上圖所示,想要實現(xiàn)SPWM波的效果我們就得讓PWM波模擬出SPWM波的效果,由于我們單片機(jī)不能產(chǎn)生負(fù)壓信號,所以我們在此處假定PWM波輸出占空比為50%的時候,等同于輸出電壓0V。原理也在于,如果占空比為50%時,那么正壓和負(fù)壓加在負(fù)載上的功率一致,相互抵消最終宏觀上顯現(xiàn)的就是0V的電壓。占空比大于50%時,相當(dāng)于輸出正壓,小于50%時相當(dāng)于輸出負(fù)壓。因此只需讓PWM波以50%占空比為原點,讓其按照正弦規(guī)律變化即刻,比如從50%一直升到90%,然后再從90%緩慢降到10%,再升到50%由此就實現(xiàn)了一個正弦規(guī)律的變化,在此處還設(shè)置了調(diào)制系數(shù),通過控制調(diào)制系數(shù)的大小,可以改變超出50%和低于50%占空比的占空比大小。比如若之前設(shè)定為最高75%占空比輸出,最低25%輸出,改變調(diào)制系數(shù)的大小,使其最高輸出90%占空比,最低10%占空比,這樣輸出的交流電壓幅值就會高。

而改變調(diào)制系數(shù)也不能直接乘以我們數(shù)組里面的占空比,由于我們設(shè)置的重裝載值是3600,對應(yīng)的最大占空就為100%,因此以1800為中心點進(jìn)行正弦規(guī)律變化。想要改變上下幅值大小,首先將數(shù)組里面執(zhí)行的當(dāng)前值減去1800,然后再乘以調(diào)制系數(shù),最終再加上一個1800就能得到相對于50%占空比的幅值倍增而不是整體倍增。大家畫畫圖就可以理解了。

四、實物調(diào)試圖片

1、額定電壓輸出24V
單相逆變電路實戰(zhàn)?。ɑ赟TM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)
單相逆變電路實戰(zhàn)!(基于STM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)

2、額定電壓輸出16V

單相逆變電路實戰(zhàn)?。ɑ赟TM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)
單相逆變電路實戰(zhàn)?。ɑ赟TM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)

3、額定電壓輸出8V
單相逆變電路實戰(zhàn)?。ɑ赟TM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)
單相逆變電路實戰(zhàn)?。ɑ赟TM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)

總結(jié)

這就是單相逆變電路的設(shè)計,有不懂的朋友可以評論下方留言,我看到了就會回復(fù)文章來源地址http://www.zghlxwxcb.cn/news/detail-400608.html

到了這里,關(guān)于單相逆變電路實戰(zhàn)?。ɑ赟TM32F103C8T6的單相逆變電路,PID控制輸出額定電壓)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 全網(wǎng)最全的MCU面試經(jīng)(基于STM32F103)

    全網(wǎng)最全的MCU面試經(jīng)(基于STM32F103)

    提示:寫本文章的緣由:本人在秋招時復(fù)習(xí)STM32有關(guān)的知識點,便順勢記錄下來。本文章的知識均屬于各大論壇的大佬回答,其中也有我的一些補(bǔ)充,本文主要以自己對STM32的理解作為框架,并積極整理各個大佬的文章,因此屬于借花獻(xiàn)佛,也不存在任何牟利,分享的初衷是便

    2024年02月09日
    瀏覽(28)
  • 基于stm32F103的蜂鳴器周期發(fā)聲實驗

    基于stm32F103的蜂鳴器周期發(fā)聲實驗

    蜂鳴器作為一種聲音報警器件,應(yīng)用廣泛。本實驗基于stm32F103單片機(jī),通過控制蜂鳴器的IO口電平電壓,使其周期性地進(jìn)行電平翻轉(zhuǎn),從而驅(qū)動蜂鳴器發(fā)出周期性的鳴叫聲。該實驗主要運用了stm32的GPIO和定時器TIM的相關(guān)功能,不僅可以鞏固這些外設(shè)的使用,也可以通過改變時間參數(shù),控

    2024年02月21日
    瀏覽(29)
  • 基于STM32F103——AS608指紋模塊+串口打印

    基于STM32F103——AS608指紋模塊+串口打印

    最近用STM32F103做一個智能門鎖小玩意,其中用到指紋模塊,我這里也單獨的寫一下筆記,不過我只是了解了基本的,就是我做門禁卡要用到的幾個東西,其它還沒了解。為了方便,做一下記錄。我這里沒有用到按鍵和顯示屏,所以還是串口輸出輸入來控制了 哈哈哈哈 這里就

    2023年04月09日
    瀏覽(31)
  • 基于STM32F103HAL庫的聲音定位系統(tǒng)

    基于STM32F103HAL庫的聲音定位系統(tǒng)

    這是一道學(xué)校出的電賽題目,要求在100*100cm的平面上實現(xiàn)定位實現(xiàn)聲音定位。由于一米太大了,我們就做了40cm的,下面的講解我按照40厘米的寫。用到的處理器是stm32f103c8t6接下來分享一下調(diào)試心得。 硬件部分需要制作發(fā)聲裝置和接收裝置,詳細(xì)可以

    2024年02月14日
    瀏覽(29)
  • 2021校賽基于stm32f103多功能臺燈

    2021校賽基于stm32f103多功能臺燈

    起源 又到了一學(xué)期一次的校內(nèi)電子設(shè)計大賽,又到了激動人心的時刻每次電子設(shè)計大賽都會出現(xiàn)各種大佬展現(xiàn)他們的作品,對于我這種菜鳥也只能默默觀望,但是呢,積極參與還是要有的,記得上一次參加做的基于51的避障小車直接買的套件焊好 然后在燒入程序就直接上戰(zhàn)場

    2023年04月20日
    瀏覽(40)
  • STM32--基于STM32F103的MAX30102心率血氧測量

    STM32--基于STM32F103的MAX30102心率血氧測量

    本文介紹基于STM32F103ZET6+MAX30102心率血氧測量+0.96寸OLED(7針)顯示(完整程序代碼見文末鏈接) 一、簡介 MAX30102是一個集成的脈搏血氧儀和心率監(jiān)測儀生物傳感器的模塊。它集成了一個紅光LED和一個紅外光LED、光電檢測器、光器件,以及帶環(huán)境光抑制的低噪聲電子電路。 MA

    2024年01月16日
    瀏覽(35)
  • 基于STM32F103的PWM電機(jī)驅(qū)動A4950

    基于STM32F103的PWM電機(jī)驅(qū)動A4950

    A4950的峰值輸出電流可達(dá)±3.5 A,工作電壓為7.6~40v。 優(yōu)點:相對于L298N模塊控制2個電機(jī)正反轉(zhuǎn)僅需要4個I/O口,體積小,發(fā)熱低。 缺點:需要2個PWM引腳才能控制正反轉(zhuǎn),所以控制2個電機(jī)需要4PWM引腳,會使用STM32F103芯片一個定時器的全部PWM通道。 A4950模塊是靠輸入2路的PWM占空

    2024年02月04日
    瀏覽(31)
  • 基于STM32F103——SIM900A發(fā)送短信+串口打印

    基于STM32F103——SIM900A發(fā)送短信+串口打印

    最近用STM32F103做一個智能門鎖小玩意,密碼輸入錯誤次數(shù)多進(jìn)行驗證碼解鎖,這里我采用SIM900A來通過發(fā)送短信輸入驗證碼進(jìn)行解鎖。就是簡單的了解了一下在這里也單獨的寫寫這個SIM900A的一寫筆記。 。。。。。。還是直接進(jìn)入主題吧 SIM900A是可以AT指令操作的,所以一般我拿

    2023年04月12日
    瀏覽(34)
  • stm32f103基于pid的藍(lán)牙循跡小車

    stm32f103基于pid的藍(lán)牙循跡小車

    目錄 前言 一、霍爾編碼器以及定時器計數(shù)原理 二、使用pwm占空比對電機(jī)速度進(jìn)行控制 三、使用systick的中斷函數(shù)進(jìn)行pid和速度的計算,還有oled的顯示 四、常用的測速方法: ?五、pid原理 六、oled的實現(xiàn) 七、藍(lán)牙通信 八、3路循跡模塊 總結(jié) ? 經(jīng)過一個月對stm32的學(xué)習(xí),終于完

    2024年02月16日
    瀏覽(34)
  • STM32項目設(shè)計:基于stm32f103c8t6智能電梯系統(tǒng)

    STM32項目設(shè)計:基于stm32f103c8t6智能電梯系統(tǒng)

    資料鏈接:待更新~ 嗶哩嗶哩視頻鏈接:https://www.bilibili.com/video/BV17D4y1V7HG/?vd_source=e5082ef80535e952b2a4301746491be0(bilibili:化作塵my) 資料鏈接:https://pan.baidu.com/s/1qObK7KBl50RmFrAtoX12kw 提取碼:iih4 實物鏈接:https://m.tb.cn/h.5h5mDXI?tk=MdxLWYHgKnz CZ0001 1、OLED顯示當(dāng)前樓層、目標(biāo)樓層等信息

    2024年02月03日
    瀏覽(40)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包