性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

SPWM輸出經(jīng)RC濾波后變成了三角波

小弟最近剛剛開始研究SPWM,在網(wǎng)上找了一個程序,通過dspic30f4011芯片產(chǎn)生SPWM波形,進而控制電機。我想驗證spwm波形正確與否,就把它跟一個1K的電阻和104的電容相連,然后用數(shù)字示波器看電容兩端的波形,結(jié)果出來的是三角波,懇請各位大蝦幫幫忙~

附上我的程序:

.equ __30F4011, 1
.include "F:\mplab\MPLAB C30\support\inc\p30f4011.inc"
.global __reset
;..............................................................................
; 配置位:
;..............................................................................
config __FOSC, CSW_FSCM_OFF & XT_PLL4 ; 關閉時鐘切換和
; 故障保護時鐘監(jiān)視并
; 使用XT 振蕩器和4 倍頻PLL 作為
; 系統(tǒng)時鐘
config __FWDT, WDT_OFF ; 關閉看門狗定時器
config __FBORPOR, PBOR_ON & BORV_27 & PWRT_16 & MCLR_EN
; 設置欠壓復位電壓
; 并將上電延遲定時器設置為16ms
config __FGS, CODE_PROT_OFF ; 對一般代碼段
; 將代碼保護設置為關閉
;..............................................................................
; 近數(shù)據(jù)存儲器(RAM 的低8KB)中的未初始化變量
;..............................................................................
.section .nbss, "b"
; 在每個PWM 周期將此變量加到16 位的
; 正弦波數(shù)值表指針。對于16 KHz 的PWM 調(diào)制,數(shù)值246 將提供
;60 Hz 的調(diào)制頻率
Frequency:.space 2
; 此變量用來設置調(diào)制幅值并換算
; 從正弦波數(shù)值表獲取的值。有效值的范圍為0 到32767
Amplitude:.space 2
; 此變量是正弦波數(shù)值表的指針。在每次PWM 中斷時,
; 它遞增一次,遞增數(shù)值是Frequency 變量的值。
Phase: .space 2
;..............................................................................
; 存儲在程序空間中的常數(shù)
;..............................................................................
.section .sine_table, "x"
.align 256
; 這是一個含有64 個值的正弦波表,覆蓋了正弦函數(shù)的360 度。
; 使用Microsoft Excel 計算這些值并將它們粘貼到此程序中。
SineTable:
.hword 0,3212,6393,9512,12539,15446,18204,20787,23170,25329
.hword 27245,28898,30273,31356,32137,32609,32767,32609,32137,31356,30273,28898
.hword 27245,25329,23170,20787,18204,15446,12539,9512,6393,3212,0,-3212,-6393
.hword -9512,-12539,-15446,-18204,-20787,-23170,-25329,-27245,-28898,-30273
.hword -31356,-32137,-32609,-32767,-32609,-32137,-31356,-30273,-28898,-27245
.hword -25329,-23170,-20787,-18204,-15446,-12539,-9512,-6393,-3212
;..............................................................................
; 此應用程序中的常數(shù)
;..............................................................................
; 此常量用來將正弦查找值換算到PWM 占空比的有效范圍內(nèi)。占空比的范圍取決于寫入PTPER 的值。
; 對于此應用程序,我們將設置PTPER = 230,使占空比介于0 和460 之間。正弦表數(shù)據(jù)是有符號的,
; 我們用230 乘以表中數(shù)據(jù),然后將乘積加上固定的偏移值從而將查找數(shù)據(jù)換算為正值
.equ PWM_Scaling, 230
; 正弦波表的指針是16 位的。把0x5555 加給
; 指針將提供120 度的偏移,而加上0xAAAA 將提供240
; 度的偏移。這些偏移用來獲取PWM 輸出的相位2 和相位3 的查找值。
.equ Offset_120, 0x5555
;..............................................................................
; 程序存儲器中的代碼部分
;..............................................................................
.text ;代碼部分的開始
__reset:
MOV #__SP_init, W15 ; 初始化堆棧指針
MOV #__SPLIM_init, W0 ; 初始化堆棧指針限制寄存器
MOV W0, SPLIM
NOP ; 在初始化SPLIM 之后,加一條NOP
CALL _wreg_init ; 調(diào)用 _wreg_init 子程序
; 可以選用RCALL 代替CALL
call Setup ; 調(diào)用程序以設置I/O 和PWM
;------------------------------------------------------------------------------
; 初始化變量
;------------------------------------------------------------------------------
clr Frequency
clr Amplitude
;------------------------------------------------------------------------------
; 主循環(huán)代碼
; 在主循環(huán)中查詢PWM 中斷標志
;------------------------------------------------------------------------------
Loop: btss IFS2,#PWMIF ; 查詢PWM 中斷標志
      bra CheckADC ; 如果置1,則繼續(xù)
      call Modulation ; 調(diào)用正弦波調(diào)制程序
      bclr IFS2, #PWMIF ; 清零PWM 中斷標志
CheckADC:
      btss IFS0,#ADIF
      bra Loop
      call ReadADC
      bra Loop
;------------------------------------------------------------------------------
; ADC 處理子程序
;------------------------------------------------------------------------------
ReadADC:
push.d W0
push.d W4
mov ADCBUF0,W0 ; 將ADC 結(jié)果讀入W0
mov ADCBUF1,W1 ; 和W1。
asr W0,#2,W4 ; 右移2 位以得到
mov W4,Frequency ; 調(diào)制頻率。
sl W1,#5,W4 ; 將AN7 和AN12 的值左移以得到
sl W0,#5,W5 ; 1.15 格式的小數(shù)數(shù)據(jù)。
mpy W4*W5,A ; 將頻率與V/Hz 的商相乘得到
sac A,W0 ; 調(diào)制幅值。將結(jié)果存儲在W0 中。
mov #28000,W1 ; 限制調(diào)制幅值以避免
cp W1,W0 ; 在PWM 調(diào)制中由死區(qū)引起的
bra GE,NoLimit ; 失真。
mov W1,W0
NoLimit:
mov W0,Amplitude
pop.d W4
pop.d W0
return
;------------------------------------------------------------------------------
; PWM 正弦波調(diào)制子程序
;------------------------------------------------------------------------------
Modulation:
push.d W0 ; 保存工作寄存器
push.d W2
push.d W4
push.d W6
push.d W8
push.d W10
; 下面的三條指令初始化TBLPAG 和指針寄存器
; 從而可使用讀表操作來訪問程序存儲器中的正弦波數(shù)據(jù)。
mov #tblpage(SineTable),W0
mov W0,TBLPAG
mov #tbloffset(SineTable),W0
; 下面的指令塊裝載正弦波調(diào)制程序中使用的各種常數(shù)和變量。
mov Phase,W1 ; 裝載正弦波表指針
mov #Offset_120,W4 ; 這是120 度偏移的值
mov Amplitude,W6 ; 裝載幅值換算系數(shù)
mov #PWM_Scaling,W7 ; 裝載PWM 換算值
mov Frequency,W8 ; 裝載將在每次中斷時與表指針相加的Frequency 常數(shù)。
; 這是指針調(diào)節(jié)代碼。將Frequency 值加給正弦表指針以使指針在正弦表中前移。
; 然后,為此指針加上相應的偏移值以得到相位2 和相位3 的指針。
; 注意:如果需要不同的相位偏移,可以在這里使用其他常數(shù)值。
; 加上0x4000 將得到90 度偏移,加上0x8000 將
; 提供180 度偏移。 在此將0x5555 裝入W4 以提供120 度偏移。
add W8,W1,W1 ; 將Frequency 值加給正弦指針
add W1,W4,W2 ; 加上120 度偏移值以得到相位2 的指針
add W2,W4,W3 ; 再加上120 度偏移以得到相位3 的指針
; 該正弦表有64 個值,所以將指針右移
; 以得到一個6 位的指針值。
lsr W1,#10,W9 ; 將相位1 的指針右移以得到高6 位
sl W9,#1,W9 ; 左移一位轉(zhuǎn)換為字節(jié)地址
lsr W2,#10,W10 ; 將相位2 的指針右移以得到高6 位
sl W10,#1,W10 ; 左移一位轉(zhuǎn)換為字節(jié)地址
lsr W3,#10,W11 ; 將相位3 的指針右移以得到高6 位
sl W11,#1,W11 ; 左移一位轉(zhuǎn)換為字節(jié)地址
; 現(xiàn)在,將每個相位的指針與基表指針相加以獲得查找值的絕對表地址。
; 然后將查找值換算為正確的幅值和在有效的占空比范圍之內(nèi)。
; 下面的指令塊為相位1 計算占空比。為相位2 和相位3 計算占空比的代碼與此相同。
add W0,W9,W9 ; 形成相位1 的表地址
tblrdl [W9],W5 ; 讀相位1 的查找值
mpy W5*W6,A ; 乘以幅值換算系數(shù)
sac A,W5 ; 存儲經(jīng)過換算的結(jié)果
mpy W5*W7,A ; 乘以PWM 換算系數(shù)
sac A,W8 ; 存儲經(jīng)過換算的結(jié)果
add W7,W8,W8 ; 加上PWM 換算系數(shù)以產(chǎn)生50% 的偏移
mov W8,PDC1 ; 寫PWM 占空比
; 下面的代碼塊為相位2 計算占空比。
add W0,W10,W10 ; 形成相位2 的表地址
tblrdl [W10],W5 ; 讀相位2 的查找值
mpy W5*W6,A ; 乘以幅值換算系數(shù)
sac A,W5 ; 存儲經(jīng)過換算的結(jié)果
mpy W5*W7,A ; 乘以PWM 換算系數(shù)
sac A,W8 ; 存儲經(jīng)過換算的結(jié)果
add W7,W8,W8 ; 加上PWM 換算系數(shù)以產(chǎn)生50% 的偏移
mov W8,PDC2 ; 寫PWM 占空比
; 下面的代碼塊為相位3 計算占空比。
add W0,W11,W11 ; 形成相位3 的表地址
tblrdl [W11],W5 ; 讀相位3 的查找值
mpy W5*W6,A ; 乘以幅值換算系數(shù)
sac A,W5 ; 存儲經(jīng)過換算的結(jié)果
mpy W5*W7,A ; 乘以PWM 換算系數(shù)
sac A,W8 ; 存儲經(jīng)過換算的結(jié)果
add W7,W8,W8 ; 加上PWM 換算系數(shù)以產(chǎn)生50% 的偏移
mov W8,PDC3 ; 寫PWM 占空比
; 現(xiàn)在,保存經(jīng)過調(diào)節(jié)的正弦波表指針從而能
; 在此代碼的下一次迭代中使用它。
mov W1,Phase
pop.d W10 ; 恢復工作寄存器
pop.d W8
pop.d W6
pop.d W4
pop.d W2
pop.d W0
return ; 從子程序返回
;------------------------------------------------------------------------------
; PWM 和ADC 的設置代碼
;-------------------------------------------------------------------------------------
Setup:
; 在使能PWM 之前需要做的第一件事是配置I/O 并復位電源模塊。
; 該控制板有一個緩沖PWM 控制線的驅(qū)動器IC。
; RD11 端口上的有效低電平使能該緩沖器。
; 此電源模塊有一條與端口RE9 相連的高電平有效復位線路。
;clr PORTD
clr PORTE
;mov #0xF7FF,W0 ; 設置RD11 輸出驅(qū)動PWM 緩沖器
;mov W0,TRISD ; 使能。
mov #0xFFC0,W0;
mov W0,TRISE ; 設置RE0~RE5為輸出
; 現(xiàn)在,通過驅(qū)動復位線并保持幾個微秒來確保電源模塊復位。
/*bset PORTE,#9
repeat #39
nop
bclr PORTE,#9 */
; 設置ADC
mov #0x0404,W0 ; 掃描輸入
mov W0,ADCON2 ; 每次中斷進行2 次采樣/ 轉(zhuǎn)換
mov #0x0003,W0;
mov W0,ADCON3 ; Tad 是2 個Tcy
clr ADCHS ;
clr ADPCFG ; 將所有A/D 引腳設置為模擬模式
clr ADCSSL ;
bset ADCSSL,#7 ; 使能對AN7 的掃描
bset ADCSSL,#8 ; 使能對AN8 的掃描
mov #0x8066,W0 ; 使能A/D、PWM 觸發(fā)和自動采樣
mov W0,ADCON1 ;
bclr IFS0,#ADIF ; 清零A/D 中斷標志位
; 現(xiàn)在設置PWM 寄存器
mov #0x0077,W0 ; 互補模式,使能#1、#2 和#3
mov W0,PWMCON1 ; 三對PWM 輸出
mov #0x000F,W0 ; 器件運行速度為7.38 MIPS 時,將產(chǎn)生2μs 的死區(qū)
mov W0,DTCON1
mov #PWM_Scaling, W0 ; 器件運行速度為7.38 MIPS 時,為16KHz PWM 設置周期
mov W0,PTPER
mov #0x0001,W0 ;
mov W0,SEVTCMP ; 將ADC 設置為以特殊事件觸發(fā)啟動
mov #0x0F00,W0 ; 將特殊事件后分頻比設置為1:16
mov W0,PWMCON2 ;
mov #0x8002,W0 ; 使能PWM 時基,中心對齊模式
mov W0,PTCON
return ; 從Setup 子程序返回
;..............................................................................
; 子程序:將W 寄存器初始化為0x0000
;..............................................................................
_wreg_init:
CLR W0
MOV W0, W14
REPEAT #12
MOV W0, [++W14]
CLR W14
RETURN
;-------- 所有代碼部分結(jié)束---------------------------------------------
.end ; 此文件中程序代碼的結(jié)尾

全部回復(4)
正序查看
倒序查看
2011-03-15 17:53
軟件看不懂...但不知你的示波器是用什么檔位測試的?最好能上個波形圖。
0
回復
2011-03-18 09:52
@GreenEnergy
軟件看不懂...但不知你的示波器是用什么檔位測試的?最好能上個波形圖。
我覺得我這個程序本身可能沒什么問題,這是我從microchip網(wǎng)站上下來的,但是網(wǎng)站上的核心芯片用的是DSPIC30F6010,而我用的是4011的芯片,所以我想請問一下您,在這個程序的基礎上改的話,應該有哪些需要改的。謝謝~
0
回復
2013-12-08 15:40
@晨光永遠
我覺得我這個程序本身可能沒什么問題,這是我從microchip網(wǎng)站上下來的,但是網(wǎng)站上的核心芯片用的是DSPIC30F6010,而我用的是4011的芯片,所以我想請問一下您,在這個程序的基礎上改的話,應該有哪些需要改的。謝謝~
可能是表格的采樣值有問題,或采樣值太少
0
回復
wwangjian
LV.4
5
2013-12-10 10:35
用匯編啊,太牛了啊。
0
回復
發(fā)