日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

如何用STC32产生SPWM波

發(fā)布時(shí)間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何用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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。