如何用STC32产生SPWM波
生活随笔
收集整理的這篇文章主要介紹了
如何用STC32产生SPWM波
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
提示:這里可以添加本文要記錄的大概內(nèi)容:
? SPWM(Sinusoidal PWM)全稱(chēng)是正弦脈沖寬度調(diào)制,是一種 廣泛應(yīng)用于電機(jī)驅(qū)動(dòng),逆變電源等領(lǐng)域的調(diào)制技術(shù)。SPWM波是一種按正弦規(guī)律變化的一種PWM波形,是PWM的一種延伸,是一種可以等效成正弦波效果的PWM技術(shù)。
? ? ? SPWM的基本原理就是面積等效原理,即沖量相等而形狀不同的窄脈沖加在具有慣性的環(huán)節(jié)上時(shí),其效果基本相同。 我們?cè)谏蒘PWM的過(guò)程中通常使用的采樣方式有:自然采樣法和規(guī)則采樣法。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、如何生成SPWM波數(shù)組
利用網(wǎng)友提供的SPWM波生成工具,可以生成任意的點(diǎn)數(shù)的波形。
或者使用excel生成也是一樣的:
二、主要程序:
/****************************************** 本程序輸出頻率固定, 如果需要變頻, 請(qǐng)用戶(hù)自己設(shè)計(jì)變頻方案.本程序從P6.0(PWM1P)輸出正相脈沖, 從P6.1(PWM1N)輸出反相脈沖(互補(bǔ)).下載時(shí), 選擇時(shí)鐘 24MHz (用戶(hù)可自行修改頻率).******************************************/#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/****************************** 用戶(hù)定義宏 ***********************************/ #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查表索引/************* 本地函數(shù)聲明 **************//********************* 主函數(shù) *************************/ void main(void) {WTST = 0; //設(shè)置程序指令延時(shí)參數(shù),賦值為0可將CPU執(zhí)行指令的速度設(shè)置為最快EAXFR = 1; //擴(kuò)展寄存器(XFR)訪問(wèn)使能CKCON = 0; //提高訪問(wèn)XRAM速度P0M1 = 0x00; P0M0 = 0x00; //設(shè)置為準(zhǔn)雙向口P1M1 = 0x00; P1M0 = 0x00; //設(shè)置為準(zhǔn)雙向口P2M1 = 0x00; P2M0 = 0x00; //設(shè)置為準(zhǔn)雙向口P3M1 = 0x00; P3M0 = 0x00; //設(shè)置為準(zhǔn)雙向口P4M1 = 0x00; P4M0 = 0x00; //設(shè)置為準(zhǔn)雙向口P5M1 = 0x00; P5M0 = 0x00; //設(shè)置為準(zhǔn)雙向口P6M1 = 0x00; P6M0 = 0x00; //設(shè)置為準(zhǔn)雙向口P7M1 = 0x00; P7M0 = 0x00; //設(shè)置為準(zhǔn)雙向口PWM1_Duty = 70;PWM2_Duty = 1677;PWM3_Duty = 1805;PWMA_CCER1 = 0x00; //寫(xiě) CCMRx 前必須先清零 CCxE 關(guān)閉通道PWMA_CCER2 = 0x00;PWMA_CCMR1 = 0x60; //通道模式配置PWMA_CCMR2 = 0x60;PWMA_CCMR3 = 0x60; // PWMA_CCMR4 = 0x60;PWMA_CCER1 = 0x55; //配置通道輸出使能和極性PWMA_CCER2 = 0x05;PWMA_ARRH = 0x09; //設(shè)置周期時(shí)間PWMA_ARRL = 0x60;// PWMA_PSCRH = 0x00; // PWMA_PSCRH = 0x0B;PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設(shè)置占空比時(shí)間PWMA_CCR1L = (u8)(PWM1_Duty);PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //設(shè)置占空比時(shí)間PWMA_CCR2L = (u8)(PWM2_Duty);PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //設(shè)置占空比時(shí)間PWMA_CCR3L = (u8)(PWM3_Duty);PWMA_DTR = 0x0C; //設(shè)置死區(qū)時(shí)間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; //高級(jí) 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; //開(kāi)始計(jì)時(shí)EA = 1; //打開(kāi)總中斷while(1){} }/******************** 中斷函數(shù) **************************/ 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); //設(shè)置占空比時(shí)間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); //設(shè)置占空比時(shí)間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); //設(shè)置占空比時(shí)間PWMA_CCR3L = (u8)(PWM3_Duty);}PWMA_SR1 = 0; }總結(jié)
以上是生活随笔為你收集整理的如何用STC32产生SPWM波的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 创建桌面宠物
- 下一篇: 快加入3DVIA在线学习中心