熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2016-9-11 23:28
正文摘要:程序能用,如果不是你想要的頻率,那就 自己改一下數(shù)據(jù) 記得同時(shí)要替換數(shù)組里面的值 如果數(shù)組里面的值不知道怎么弄 點(diǎn)擊這個(gè)鏈接下載軟件就行 如果下載軟件 記得 看一下我的問題 #include<re ... |
我來更新一下吧,再傳一些使用說明:![]() ![]() |
參與人數(shù) 1 | 黑幣 +50 | 收起 理由 |
---|---|---|
![]() | + 50 | 回帖助人的獎(jiǎng)勵(lì)! |
/*---------------------------------------------------------------------*/ /* --- STC MCU Limited ------------------------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* 如果要在程序中使用此代碼,請?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序 */ /*---------------------------------------------------------------------*/ /************* 功能說明 ************** 本例程基于STC8H8K64U為主控芯片的實(shí)驗(yàn)箱9進(jìn)行編寫測試,STC8H系列芯片可通用參考. 高級PWM定時(shí)器 PWM1P/PWM1N,PWM2P/PWM2N,PWM3P/PWM3N,PWM4P/PWM4N 每個(gè)通道都可獨(dú)立實(shí)現(xiàn)PWM輸出,或者兩兩互補(bǔ)對稱輸出. 演示使用PWM1P,PWM1N產(chǎn)生互補(bǔ)的SPWM. 主時(shí)鐘選擇24MHZ, PWM時(shí)鐘選擇1T, PWM周期2400, 死區(qū)12個(gè)時(shí)鐘(0.5us).正弦波表用200點(diǎn). 輸出正弦波頻率 = 24000000 / 2400 / 200 = 50 HZ. 本程序僅僅是一個(gè)SPWM的演示程序, 用戶可以通過上面的計(jì)算方法修改PWM周期和正弦波的點(diǎn)數(shù)和幅度. 本程序輸出頻率固定, 如果需要變頻, 請用戶自己設(shè)計(jì)變頻方案. 本程序從P6.0(PWM1P)輸出正相脈沖, 從P6.1(PWM1N)輸出反相脈沖(互補(bǔ)). ******************************************/ #include "reg51.h" //包含此頭文件后,里面聲明的寄存器不需要再手動(dòng)輸入,避免重復(fù)定義 #include "intrins.h" #include "T_SineTable.h" #define MAIN_Fosc 24000000L //定義主時(shí)鐘 typedef unsigned char u8; typedef unsigned int u16; typedef unsigned long u32; //手動(dòng)輸入聲明"reg51.h"頭文件里面沒有定義的寄存器 sfr TH2 = 0xD6; sfr TL2 = 0xD7; sfr IE2 = 0xAF; sfr INT_CLKO = 0x8F; sfr AUXR = 0x8E; sfr P_SW1 = 0xA2; sfr P_SW2 = 0xBA; sfr P4 = 0xC0; sfr P5 = 0xC8; sfr P6 = 0xE8; sfr P7 = 0xF8; sfr P1M1 = 0x91; //PxM1.n,PxM0.n =00--->Standard, 01--->push-pull sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain sfr P0M1 = 0x93; sfr P0M0 = 0x94; sfr P2M1 = 0x95; sfr P2M0 = 0x96; sfr P3M1 = 0xB1; sfr P3M0 = 0xB2; sfr P4M1 = 0xB3; sfr P4M0 = 0xB4; sfr P5M1 = 0xC9; sfr P5M0 = 0xCA; sfr P6M1 = 0xCB; sfr P6M0 = 0xCC; sfr P7M1 = 0xE1; sfr P7M0 = 0xE2; sbit P00 = P0^0; sbit P01 = P0^1; sbit P02 = P0^2; sbit P03 = P0^3; sbit P04 = P0^4; sbit P05 = P0^5; sbit P06 = P0^6; sbit P07 = P0^7; sbit P10 = P1^0; sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit P14 = P1^4; sbit P15 = P1^5; sbit P16 = P1^6; sbit P17 = P1^7; sbit P20 = P2^0; sbit P21 = P2^1; sbit P22 = P2^2; sbit P23 = P2^3; sbit P24 = P2^4; sbit P25 = P2^5; sbit P26 = P2^6; sbit P27 = P2^7; sbit P30 = P3^0; sbit P31 = P3^1; sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4; sbit P35 = P3^5; sbit P36 = P3^6; sbit P37 = P3^7; sbit P40 = P4^0; sbit P41 = P4^1; sbit P42 = P4^2; sbit P43 = P4^3; sbit P44 = P4^4; sbit P45 = P4^5; sbit P46 = P4^6; sbit P47 = P4^7; sbit P50 = P5^0; sbit P51 = P5^1; sbit P52 = P5^2; sbit P53 = P5^3; sbit P54 = P5^4; sbit P55 = P5^5; sbit P56 = P5^6; sbit P57 = P5^7; /****************************** 用戶定義宏 ***********************************/ #define PWMA_ENO (*(unsigned char volatile xdata *) 0xFEB1) #define PWMA_PS (*(unsigned char volatile xdata *) 0xFEB2) #define PWMA_CR1 (*(unsigned char volatile xdata *) 0xFEC0) #define PWMA_CR2 (*(unsigned char volatile xdata *) 0xFEC1) #define PWMA_SMCR (*(unsigned char volatile xdata *) 0xFEC2) #define PWMA_ETR (*(unsigned char volatile xdata *) 0xFEC3) #define PWMA_IER (*(unsigned char volatile xdata *) 0xFEC4) #define PWMA_SR1 (*(unsigned char volatile xdata *) 0xFEC5) #define PWMA_SR2 (*(unsigned char volatile xdata *) 0xFEC6) #define PWMA_EGR (*(unsigned char volatile xdata *) 0xFEC7) #define PWMA_CCMR1 (*(unsigned char volatile xdata *) 0xFEC8) #define PWMA_CCMR2 (*(unsigned char volatile xdata *) 0xFEC9) #define PWMA_CCMR3 (*(unsigned char volatile xdata *) 0xFECA) #define PWMA_CCMR4 (*(unsigned char volatile xdata *) 0xFECB) #define PWMA_CCER1 (*(unsigned char volatile xdata *) 0xFECC) #define PWMA_CCER2 (*(unsigned char volatile xdata *) 0xFECD) #define PWMA_CNTRH (*(unsigned char volatile xdata *) 0xFECE) #define PWMA_CNTRL (*(unsigned char volatile xdata *) 0xFECF) #define PWMA_PSCRH (*(unsigned char volatile xdata *) 0xFED0) #define PWMA_PSCRL (*(unsigned char volatile xdata *) 0xFED1) #define PWMA_ARRH (*(unsigned char volatile xdata *) 0xFED2) #define PWMA_ARRL (*(unsigned char volatile xdata *) 0xFED3) #define PWMA_RCR (*(unsigned char volatile xdata *) 0xFED4) #define PWMA_CCR1H (*(unsigned char volatile xdata *) 0xFED5) #define PWMA_CCR1L (*(unsigned char volatile xdata *) 0xFED6) #define PWMA_CCR2H (*(unsigned char volatile xdata *) 0xFED7) #define PWMA_CCR2L (*(unsigned char volatile xdata *) 0xFED8) #define PWMA_CCR3H (*(unsigned char volatile xdata *) 0xFED9) #define PWMA_CCR3L (*(unsigned char volatile xdata *) 0xFEDA) #define PWMA_CCR4H (*(unsigned char volatile xdata *) 0xFEDB) #define PWMA_CCR4L (*(unsigned char volatile xdata *) 0xFEDC) #define PWMA_BKR (*(unsigned char volatile xdata *) 0xFEDD) #define PWMA_DTR (*(unsigned char volatile xdata *) 0xFEDE) #define PWMA_OISR (*(unsigned char volatile xdata *) 0xFEDF) /*****************************************************************************/ #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 PWM_Index; //SPWM查表索引 /******************** 主函數(shù) **************************/ void main(void) { P_SW2 |= 0x80; //擴(kuò)展寄存器(XFR)訪問使能 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 = 1220; PWMA_CCER1 = 0x00; //寫 CCMRx 前必須先清零 CCxE 關(guān)閉通道 PWMA_CCER2 = 0x00; PWMA_CCMR1 = 0x68; //通道模式配置 // PWMA_CCMR2 = 0x68; // PWMA_CCMR3 = 0x68; // PWMA_CCMR4 = 0x68; PWMA_CCER1 = 0x05; //配置通道輸出使能和極性 // PWMA_CCER2 = 0x55; PWMA_ARRH = 0x09; //設(shè)置周期時(shí)間 PWMA_ARRL = 0x60; PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設(shè)置占空比時(shí)間 PWMA_CCR1L = (u8)(PWM1_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; //高級 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; //開始計(jì)時(shí) EA = 1; //打開總中斷 while (1) { } } /******************** 中斷函數(shù) **************************/ void PWMA_ISR() interrupt 26 { if(PWMA_SR1 & 0X01) { PWMA_SR1 &=~0X01; PWM1_Duty = T_SinTable[PWM_Index]; if(++PWM_Index >= 200) PWM_Index = 0; PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設(shè)置占空比時(shí)間 PWMA_CCR1L = (u8)(PWM1_Duty); } PWMA_SR1 = 0; } |
foxpro2005 發(fā)表于 2020-9-23 21:55 牛逼啊老哥 |
準(zhǔn)備研究一下,謝謝分享![]() |
樓主的問題也是我的問題,樓主有解決了嗎 |
STC8H/STC8G/STC32系列可以方便的產(chǎn)生SPWM |
可以方便的產(chǎn)生SPWM.png (286.59 KB, 下載次數(shù): 510)
做個(gè)課件下載研究下。多謝 |
這個(gè)SPWM如果在程序里做成頻率可調(diào),不用MCU外圍的電路修正就完美了 |
這里計(jì)算的是占空比吧? |
試一下這個(gè)軟件 |
非常感謝,正研究spwm |
有仿真圖嗎? |
有protues仿真圖嗎? |
感謝,下載下學(xué)習(xí)一下。 |
正弦波樣本值怎么有點(diǎn)問題啊 |
foxpro2005 發(fā)表于 2020-9-23 21:55 謝謝分享 |
單片機(jī)怎么產(chǎn)生spwm波呀 |
不錯(cuò)的學(xué)習(xí)資料 |
不錯(cuò),挺好用的 |
先謝過樓主,學(xué)習(xí)一下 |
還不知道怎么用,謝謝樓主 |
學(xué)習(xí)一下,正好對這個(gè)挺感興趣的。 |
謝謝了 |
正需要,謝謝分享 |
學(xué)習(xí)一哈 |
私發(fā)一份行嗎 |
![]() |
感謝樓主分享 |
很實(shí)用的spwm工具 |
幫了大忙了 |
謝謝分享,正在學(xué)習(xí)正弦波 |
不錯(cuò) 不錯(cuò) 感謝分享 |
下載參考 |
spwm怎么在電腦上看? |
請問:頻率可調(diào)么? |
這工具不錯(cuò),程序這么簡單能用嗎 |
謝謝分享 |
哪個(gè)引腳是輸出口 |
可以的好像很好玩 |
軟件那幾個(gè)參數(shù)什么意思? |
Powered by 單片機(jī)教程網(wǎng)