如何用STC32产生SPWM波
生活随笔
收集整理的這篇文章主要介紹了
如何用STC32产生SPWM波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
提示:這里可以添加本文要記錄的大概內容:
? SPWM(Sinusoidal PWM)全稱是正弦脈沖寬度調制,是一種 廣泛應用于電機驅動,逆變電源等領域的調制技術。SPWM波是一種按正弦規律變化的一種PWM波形,是PWM的一種延伸,是一種可以等效成正弦波效果的PWM技術。
? ? ? SPWM的基本原理就是面積等效原理,即沖量相等而形狀不同的窄脈沖加在具有慣性的環節上時,其效果基本相同。 我們在生成SPWM的過程中通常使用的采樣方式有:自然采樣法和規則采樣法。
提示:以下是本篇文章正文內容,下面案例可供參考
一、如何生成SPWM波數組
利用網友提供的SPWM波生成工具,可以生成任意的點數的波形。
或者使用excel生成也是一樣的:
二、主要程序:
/****************************************** 本程序輸出頻率固定, 如果需要變頻, 請用戶自己設計變頻方案.本程序從P6.0(PWM1P)輸出正相脈沖, 從P6.1(PWM1N)輸出反相脈沖(互補).下載時, 選擇時鐘 24MHz (用戶可自行修改頻率).******************************************/#include <STC32G.H>#include "stdio.h" #include "intrins.h" #include "T_SineTable.h"typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32;#define MAIN_Fosc 24000000UL/****************************** 用戶定義宏 ***********************************/ #define PWM1_1 0x00 //P:P1.0 N:P1.1 #define PWM1_2 0x01 //P:P2.0 N:P2.1 #define PWM1_3 0x02 //P:P6.0 N:P6.1#define PWM2_1 0x00 //P:P1.2/P5.4 N:P1.3 #define PWM2_2 0x04 //P:P2.2 N:P2.3 #define PWM2_3 0x08 //P:P6.2 N:P6.3#define PWM3_1 0x00 //P:P1.4 N:P1.5 #define PWM3_2 0x10 //P:P2.4 N:P2.5 #define PWM3_3 0x20 //P:P6.4 N:P6.5#define PWM4_1 0x00 //P:P1.6 N:P1.7 #define PWM4_2 0x40 //P:P2.6 N:P2.7 #define PWM4_3 0x80 //P:P6.6 N:P6.7 #define PWM4_4 0xC0 //P:P3.4 N:P3.3#define ENO1P 0x01 #define ENO1N 0x02 #define ENO2P 0x04 #define ENO2N 0x08 #define ENO3P 0x10 #define ENO3N 0x20 #define ENO4P 0x40 #define ENO4N 0x80 /*****************************************************************************//************* 本地常量聲明 **************//************* 本地變量聲明 **************/ u16 PWM1_Duty; u8 PWM1_Index; //SPWM查表索引 u16 PWM2_Duty; u8 PWM2_Index; //SPWM查表索引 u16 PWM3_Duty; u8 PWM3_Index; //SPWM查表索引/************* 本地函數聲明 **************//********************* 主函數 *************************/ void main(void) {WTST = 0; //設置程序指令延時參數,賦值為0可將CPU執行指令的速度設置為最快EAXFR = 1; //擴展寄存器(XFR)訪問使能CKCON = 0; //提高訪問XRAM速度P0M1 = 0x00; P0M0 = 0x00; //設置為準雙向口P1M1 = 0x00; P1M0 = 0x00; //設置為準雙向口P2M1 = 0x00; P2M0 = 0x00; //設置為準雙向口P3M1 = 0x00; P3M0 = 0x00; //設置為準雙向口P4M1 = 0x00; P4M0 = 0x00; //設置為準雙向口P5M1 = 0x00; P5M0 = 0x00; //設置為準雙向口P6M1 = 0x00; P6M0 = 0x00; //設置為準雙向口P7M1 = 0x00; P7M0 = 0x00; //設置為準雙向口PWM1_Duty = 70;PWM2_Duty = 1677;PWM3_Duty = 1805;PWMA_CCER1 = 0x00; //寫 CCMRx 前必須先清零 CCxE 關閉通道PWMA_CCER2 = 0x00;PWMA_CCMR1 = 0x60; //通道模式配置PWMA_CCMR2 = 0x60;PWMA_CCMR3 = 0x60; // PWMA_CCMR4 = 0x60;PWMA_CCER1 = 0x55; //配置通道輸出使能和極性PWMA_CCER2 = 0x05;PWMA_ARRH = 0x09; //設置周期時間PWMA_ARRL = 0x60;// PWMA_PSCRH = 0x00; // PWMA_PSCRH = 0x0B;PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設置占空比時間PWMA_CCR1L = (u8)(PWM1_Duty);PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //設置占空比時間PWMA_CCR2L = (u8)(PWM2_Duty);PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //設置占空比時間PWMA_CCR3L = (u8)(PWM3_Duty);PWMA_DTR = 0x0C; //設置死區時間PWMA_ENO = 0x00;PWMA_ENO |= ENO1P; //使能輸出PWMA_ENO |= ENO1N; //使能輸出PWMA_ENO |= ENO2P; //使能輸出PWMA_ENO |= ENO2N; //使能輸出PWMA_ENO |= ENO3P; //使能輸出PWMA_ENO |= ENO3N; //使能輸出 // PWMA_ENO |= ENO4P; //使能輸出 // PWMA_ENO |= ENO4N; //使能輸出PWMA_PS = 0x00; //高級 PWM 通道輸出腳選擇位PWMA_PS |= PWM1_3; //選擇 PWM1_3 通道PWMA_PS |= PWM2_3; //選擇 PWM2_3 通道PWMA_PS |= PWM3_3; //選擇 PWM3_3 通道 // PWMA_PS |= PWM4_3; //選擇 PWM4_3 通道PWMA_BKR = 0x80; //使能主輸出PWMA_IER = 0x01; //使能中斷PWMA_CR1 |= 0x01; //開始計時EA = 1; //打開總中斷while(1){} }/******************** 中斷函數 **************************/ void PWMA_ISR() interrupt PWMA_VECTOR { if(PWMA_SR1 & 0X01){PWMA_SR1 &=~0X01; PWM1_Duty = A_SinTable[PWM1_Index];if(++PWM1_Index >= 200) PWM1_Index = 0; // PWM1_Index++;PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設置占空比時間PWMA_CCR1L = (u8)(PWM1_Duty);PWM2_Duty = B_SinTable[PWM2_Index];if(++PWM2_Index >= 200) PWM2_Index = 0; // PWM2_Index++;PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //設置占空比時間PWMA_CCR2L = (u8)(PWM2_Duty);PWM3_Duty = C_SinTable[PWM3_Index];if(++PWM3_Index >= 200) PWM3_Index = 0; // PWM3_Index++;PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //設置占空比時間PWMA_CCR3L = (u8)(PWM3_Duty);}PWMA_SR1 = 0; }總結
以上是生活随笔為你收集整理的如何用STC32产生SPWM波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 创建桌面宠物
- 下一篇: 基于JavaSwing的账本账簿个人财务