• slider image 514
  • slider image 516
  • slider image 517
  • slider image 518
  • slider image 519
:::

論壇索引


Board index » All Posts




Re: PIC24FJ128GB106 PWM頻率問題
版主
版主


看起來你的 PWM 應該是使用 Compare Match Mode 來產生的。在此模式下,有些暫存器的設定值是有限制的,這需要遵守一個設定的原則: PR2 >= OCxRS>OCxR
PR2 是 Timer2 的計時器提供了 PWM 的週期,改變 PR2 的值就可以改變 PWM 的頻率。
一般常使用的 PWM Mode 是設定成 "Continuous Output Pulse mode";在此模式下產生的是連續的 PWM 波形,PR2 從 0 往上計數,PR2 == OCxR 時期 PWM 的輸出為 Hi;當 PR2 在往上計數到 == OCxRS 時,PWM 輸出便 Low;此動作會一直循環而產生 PWM 的輸出。調整 PR2 可以改變 PWM 週期,變更 OCxR 及 OCxRS 則可改變 Duty。

關於此動作說明可以到教育訓練光碟下載 "dsPICMOD dsPIC30F Module Training" 裡面有一 "9. Output Comparator" 的教材面就有說明。

Compare Match Mode 的輸出參考一下貼圖。

Attach file:



jpg  擷取.JPG (56.67 KB)
16_5fc46889d031f.jpg 603X461 px

發表於: 2020/11/30 11:29
頂部


Re: PIC24FJ128GB106 PWM頻率問題
新會員
新會員


您好,感謝回覆
我使用的是mcc的程式生成,以下是相關code

oc1的設定。
參照:
#include "oc1.h"

/** OC Mode.
  @Summary
    Defines the OC Mode.
  @Description
    This data type defines the OC Mode of operation.
*/

static uint16_t         gOC1Mode;

/**
  Section: Driver Interface
*/


void OC1_Initialize (void)
{
    
// ENFLT0 disabled; OCSIDL disabled; OCM Edge-Aligned PWM mode; OCFLT0 disabled; OCTSEL TMR2; TRIGMODE Only Software; 
    
OC1CON1 0x06;
    
// SYNCSEL TMR2; TRIGSTAT disabled; OCINV disabled; OCTRIG Trigger; OC32 disabled; FLTOUT disabled; OCTRIS disabled; FLTMD Cycle; FLTTRIEN disabled; 
    
OC1CON2 0xCC;
    
// CMP2B 100; 
    
OC1RS 1000;
    
// CMP1B 30; 
    
OC1R 300;
    
// OC1TMR 0; 
    
OC1TMR 0x00;
    
gOC1Mode OC1CON1bits.OCM;
    
IFS0bits.OC1IF false;
    
IEC0bits.OC1IE true;
}

void __attribute__ ((weak)) OC1_CallBack(void)
{
    
// Add your custom callback code here
}

void __attribute__ ( ( interruptno_auto_psv ) ) _ISR _OC1Interruptvoid )
{    
    if(
IFS0bits.OC1IF)
    {
        
// OC1 callback function 
        
OC1_CallBack();
        
IFS0bits.OC1IF 0;
    }
}


void OC1_Startvoid )
{
    
OC1CON1bits.OCM gOC1Mode;
}


void OC1_Stopvoid )
{
    
OC1CON1bits.OCM 0;
}

void OC1_SecondaryValueSetuint16_t secVal )
{
   
    
OC1RS secVal;
}


void OC1_PrimaryValueSetuint16_t priVal )
{
   
    
OC1R priVal;
}

bool OC1_IsCompareCycleCompletevoid )
{
    return(
IFS0bits.OC1IF);
}


bool OC1_FaultStatusGetOC1_FAULTS faultNum )
{
    
bool status;
    
/* Return the status of the fault condition */
   
    
switch(faultNum)
    { 
        case 
OC1_FAULT0:
            
status OC1CON1bits.OCFLT0;
            break;
        default :
            break;

    }
    return(
status);
}


void OC1_FaultStatusClearOC1_FAULTS faultNum )
{
    
    switch(
faultNum)
    { 
        case 
OC1_FAULT0:
            
OC1CON1bits.OCFLT0 0;
                break;
        default :
                break;
    }    
}


void OC1_ManualTriggerSetvoid )
{
    
OC1CON2bits.TRIGSTATtrue
}

bool OC1_TriggerStatusGetvoid )
{
    return( 
OC1CON2bits.TRIGSTAT );
}


void OC1_TriggerStatusClearvoid )
{
    
/* Clears the trigger status */
    
OC1CON2bits.TRIGSTAT 0;
}

/**
 End of File
*/


timer2的設定。

參照:
#include <stdio.h>
#include "tmr2.h"

/**
 Section: File specific functions
*/

/**
  Section: Data Type Definitions
*/

/** TMR Driver Hardware Instance Object

  @Summary
    Defines the object required for the maintenance of the hardware instance.

  @Description
    This defines the object required for the maintenance of the hardware
    instance. This object exists once per hardware instance of the peripheral.

  Remarks:
    None.
*/

typedef struct _TMR_OBJ_STRUCT
{
    
/* Timer Elapsed */
    
volatile bool           timerElapsed;
    
/*Software Counter value*/
    
volatile uint8_t        count;

TMR_OBJ;

static 
TMR_OBJ tmr2_obj;

/**
  Section: Driver Interface
*/

void TMR2_Initialize (void)
{
    
//TMR2 0; 
    
TMR2 0x00;
    
//Period = 0.01 s; Frequency = 8000000 Hz; PR2 9999; 
    
PR2 0x270F;
    
//TCKPS 1:8; T32 16 Bit; TON enabled; TSIDL disabled; TCS FOSC/2; TGATE disabled; 
    
T2CON 0x8010;

    
    
tmr2_obj.timerElapsed false;

}


void TMR2_Tasks_16BitOperationvoid )
{
    
/* Check if the Timer Interrupt/Status is set */
    
if(IFS0bits.T2IF)
    {
        
tmr2_obj.count++;
        
tmr2_obj.timerElapsed true;
        
IFS0bits.T2IF false;
    }
}

void TMR2_Period16BitSetuint16_t value )
{
    
/* Update the counter values */
    
PR2 value;
    
/* Reset the status information */
    
tmr2_obj.timerElapsed false;
}

uint16_t TMR2_Period16BitGetvoid )
{
    return( 
PR2 );
}

void TMR2_Counter16BitSet uint16_t value )
{
    
/* Update the counter values */
    
TMR2 value;
    
/* Reset the status information */
    
tmr2_obj.timerElapsed false;
}

uint16_t TMR2_Counter16BitGetvoid )
{
    return( 
TMR2 );
}




void TMR2_Startvoid )
{
    
/* Reset the status information */
    
tmr2_obj.timerElapsed false;


    
/* Start the Timer */
    
T2CONbits.TON 1;
}

void TMR2_Stopvoid )
{
    
/* Stop the Timer */
    
T2CONbits.TON false;

}

bool TMR2_GetElapsedThenClear(void)
{
    
bool status;
    
    
status tmr2_obj.timerElapsed;

    if(
status == true)
    {
        
tmr2_obj.timerElapsed false;
    }
    return 
status;
}

int TMR2_SoftwareCounterGet(void)
{
    return 
tmr2_obj.count;
}

void TMR2_SoftwareCounterClear(void)
{
    
tmr2_obj.count 0
}

/**
 End of File
*/


原本想放上截圖但圖片無法插入,以上是mcc生成的code

謝謝。

發表於: 2020/11/30 11:07
頂部


Re: PIC24FJ128GB106 PWM頻率問題
管理員
管理員


OCxRS/OCxR 在PWM模式下,是Dual Buffer的架構,主要是避免突然改變數值造成當前周期的PWM工作週期異常的狀態。
以上是多說了。
簡單的說,OCxRS/OCxR就是改變周期的,PRx則是改變頻率的。
如果動作不正常就是操作上有錯誤,是否可以把你的程式碼上傳來看看,或許能找到問題點。

發表於: 2020/11/30 9:45
頂部


PIC24FJ128GB106 PWM頻率問題
新會員
新會員


各位前輩好,小弟目前剛碰PIC24的晶片,以前也沒有過相關經驗,還請各位前輩多多賜教

我目前正在製作PWM,用的是PIC24FJ128GB106這塊晶片,使用MPLAB X IDE內的MCC撰寫程式

我上網查資料以及看了datasheet後有些地方一直不了解。

根據datasheet中pwm的頻率公式是:PWM Period = [(PRy) + 1] • TCY • (Timer Prescale Value)
裡面說明與PRy有關係。
但是測試後發現幾個問題:
1、我在調整PWM的DUTY時更動OCxRS OCxR 這兩個暫存器時竟然會連帶影響到PWM的頻率
2、根據原理,我調整PR2(我使用TIMER2)時並不會改變PWM的頻率
3、根據理論,當我的PR2+1我想請問要如何才能正確的調整PWM的頻率?
感謝

發表於: 2020/11/29 20:56
頂部


Re: ATWINC3400
初級會員
初級會員


if I use XIN32/XOUT32 of ATSAME51N19A to connect a 32.768khz crystal, can I connect the XOUT32 to RTC_CLK of ATWINC3400 to save the component count?

do I need to add a buffer like 74lvc04 to reshape the waveform?

or I can configure one GPIO to output the 32.768khz? If the MCU is put into sleep mode, is the output still running?

PS. suppose the ATWINC need a free running 32.768khz in power down mode(CHIP_EN=LOW)

Anthony

發表於: 2020/11/28 12:01
best regards,
Anthony
頂部


Re: dspic33ch PGXCAP問題
新會員
新會員


你好,我是用PWM模組裡面,有一個PCI功能,有外部訊上升緣RESET我PWM的timer,
是即時運作開關訊號,偵測開關頻率需使用PGXCAP功能,
不用SCCP模組Capture功能是因為會有兩個中斷,
PWM中斷和Capture中斷互搶可能性,所以沒用SCCP的Capture功能

發表於: 2020/11/27 17:15
頂部


Re: dspic33ch PGXCAP問題
版主
版主


有點困惑? 為什這要抓外部頻率不是用 Capture Module 來量測頻率 (10.0 CAPTURE/COMPARE/PWM/
TIMER MODULES (SCCP) )。

我也不懂為何 PWM 可以量測頻率?

發表於: 2020/11/27 13:55
頂部


Re: PIC16F18855的CIP功能,可由軟體來觸發嗎?
高級會員
高級會員


了解,謝謝版主

發表於: 2020/11/27 11:03
頂部


Re: PIC16F18855的CIP功能,可由軟體來觸發嗎?
版主
版主


這些都是透過暫存器的設定依外界電壓啟動 ZCD 的。所以也可以用軟體方式變更或修改暫存器來控制硬體的出發輸出。

發表於: 2020/11/27 9:42
頂部


Re: PIC16F18855的CIP功能,可由軟體來觸發嗎?
版主
版主


這些都是透過暫存器的設定依外界電壓啟動 ZCD 的。所以也可以用軟體方式變更或修改暫存器來控制硬體的出發輸出。

發表於: 2020/11/27 9:42
頂部



« 1 ... 222 223 224 (225) 226 227 228 ... 7528 »



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------