STM32单相正弦逆变
单片机源程序如下:
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "SPWM.h"
- #include "keyboard.h"
- #include "bsp_usart1.h"
- #include "OLED_I2C.h"
- #include "bsp_i2c_gpio.h"
- /*把这个SPWM调一下 6路,其中3路一样,另外3路一样,这两组之间互补
- 2018/5/10 16:52:06
- 2018/5/10 16:52:06
- 死区300ns 载频20K左右,可以自己定 正弦频率50HZ 三相正弦之间相差120°
- **/
- vu8 key = 0; //按键值
- vu16 freq =20000, Period=0; //PWM与定时器中断频率;自动重装载值
- __IO float Period_percent; //PWM占空比变化因子,用于修改脉宽
- int k=0;
- int BUFF1[4];
- int BUFF2[4];
- int result;
- float Kp = 0.32 ; //比例常数
- float Ti = 0.09 ; //积分时间常数
- float Td = 0.0028 ; //微分时间常数
- #define T 0.02 //采样周期
- #define Ki Kp*(T/Ti) // Kp Ki Kd 三个主要参数
- #define Kd Kp*(Td/T)
- int main(void)
- {
- unsigned char i,j;
- unsigned char u[17]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
- SystemInit();
- NVIC_Configuration();
- delay_init();
- //USART1_Config();
- KeyBoard_Config();
- /*KEY_Init(); */
- Period_percent = ((SystemCoreClock / freq) - 1) / 32767.0; //0.11s
-
- TIM1_PWM_Init(freq,0); //输出PWM的频率为8KHz(一周期400个点,正弦波的频率为8000/400=20Hz)
- TIM2_Int_Init(freq,0); //定时器中断的频率为8KHz
- if(i2c_CheckDevice(OLED_ADDRESS)==0)
- {
- printf("OLED OK\r\n");
- OLED_Init();
- OLED_Fill(0xFF);//全屏点亮
- delay_us(20000);
- OLED_Fill(0x00);//全屏灭
- delay_us(20000);
- }
- //PID_set(Kp,Ki,Kd);
- while(1)
- {
- i=Read_KeyValue();
- if (i>0)
- j = u[i-1];
- switch(j)
- {
- case 0:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 1 ",2); //测试8*16字符
- BUFF1[k]=1;
- k++;
- break;
-
- case 1:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 2 ",2); //测试8*16字符
- BUFF1[k]=2;
- k++;
- break;
-
- case 2:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 3 ",2); //测试8*16字符
- BUFF1[k]=3;
- k++;
- break;
-
- case 3:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 4 ",2); //测试8*16字符
- BUFF1[k]=4;
- k++;
- break;
-
- case 4:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 5 ",2); //测试8*16字符
- BUFF1[k]=5;
- k++;
- break;
-
- case 5:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 6 ",2); //测试8*16字符
- BUFF1[k]=6;
- k++;
- break;
-
- case 6:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 7 ",2); //测试8*16字符
- BUFF1[k]=7;
- k++;
- break;
-
- case 7:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 8 ",2); //测试8*16字符
- BUFF1[k]=8;
- k++;
- break;
-
- case 8:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 9 ",2); //测试8*16字符
- BUFF1[k]=9;
- k++;
- break;
-
- case 9:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 10 ",2); //测试8*16字符
- BUFF1[k]=0;
- k++;
- break;
-
- case 10:
- OLED_ShowStr(0,4,(unsigned char*)"Hello 11 ",2); //测试8*16字符
- break;
-
- // case 11:
- // OLED_ShowStr(0,4,(unsigned char*)"Hello 12 ",2); //测试8*16字符
- // break;
- //
- // case 12:
- // OLED_ShowStr(0,4,(unsigned char*)"Hello 13 ",2); //测试8*16字符
- // break;
- //
- // case 13:
- // OLED_ShowStr(0,4,(unsigned char*)"Hello 14 ",2); //测试8*16字符
- // break;
- //
- // case 14:
- // OLED_ShowStr(0,4,(unsigned char*)"Hello 15 ",2); //测试8*16字符
- // break;
- //
- // case 15:
- // OLED_ShowStr(0,4,(unsigned char*)"Hello 16 ",2); //测试8*16字符
- // break;
-
- /* case 16:
- LED1_TOGGLE;
- OLED_ShowStr(0,4,(unsigned char*)"Hello g ",2); //测试8*16字符
- break; */
-
- default:
- OLED_ShowStr(0,4,(unsigned char*)"no key ",2); //测试8*16字符
- }
- }
- /* key=KEY_Scan(0);
- if(key == 1 )
- {
- freq += 400; //sin频率 = freq/400
- Period = (SystemCoreClock / freq) - 1; //算出自动重装载值,Tout(溢出时间)= ((arr+1)*(psc+1))/Tclk= 1/freq;
- TIM1->ARR = Period;
- TIM2->ARR = Period;
- Period_percent = Period / 32767.0;
-
- }
- else if(key == 2)
- {
- freq -= 400;
- Period = (SystemCoreClock / freq) - 1;
- TIM1->ARR = Period;
- TIM2->ARR = Period;
- Period_percent = Period / 32767.0;
- } */
- }
复制代码
所有资料51hei提供下载:
STM32F103正弦逆变输出25v,50HZ,频率可调.rar
(380.72 KB, 下载次数: 90)
|