會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客



« 1 2 3 (4)


Re: 如何寫多通道AD做過電壓保護中斷程式
資深會員
註冊日期:
2009/04/07 13:30
所屬群組:
註冊會員
文章: 151
等級: 11; EXP: 34
HP : 0 / 258
MP : 50 / 6209
離線
(嗯---, 是做過電流保護啊!
而且更之前好像提問了電池充電,
該不是 電池充電的過電流保護吧!

各位大大如果知道相關實務,
不妨給他 "很很的"建議一下...哈.哈.哈, 哈!哈!)

「以上為幻想劇情, 請勿過度投入, 有害身心健康!」


真是抱歉了! 我並沒有這一項的實務相關.

PIC16F1786 ADC 模組的 Auto Conversion Trigger, 嗯...
看起來像是有使用到 PSMCx 或 CCPx 時可順便幫忙令 ADGO=1,
不過若本身沒有使用這兩項, 恐怕還是得選擇在中斷尾端自行設定 ADGO=1 了.(沒便宜可佔, 真是的...)

PIC16F1786 的 ADC 最小 Tad 減到 1.0 us 了,
不過整個 ADC 轉換需要多些個數的 Tad,
取樣/保持電容也小多了.

3月09日 14:04:18
轉換PDF檔 列印


Re: 如何寫多通道AD做過電壓保護中斷程式
初級會員
註冊日期:
1月05日 17:30:44
所屬群組:
註冊會員
文章: 34
等級: 4; EXP: 59
HP : 0 / 89
MP : 11 / 122
離線
謝謝前輩 小弟才剛入行不久
所以有很多奇怪的問題 真是不好意思

所以就算用比較新的那顆 做法還是只能一樣嗎
因為似乎不會用到PSMx和CCPx這兩項
再請教一個問題 提升晶振頻率會提升整個程式執行速度嗎

3月09日 15:41:08

ben.huang 於 2017年03月09日 15:59:24
轉換PDF檔 列印


Re: 如何寫多通道AD做過電壓保護中斷程式
資深會員
註冊日期:
2009/04/07 13:30
所屬群組:
註冊會員
文章: 151
等級: 11; EXP: 34
HP : 0 / 258
MP : 50 / 6209
離線
依你的使用狀況,
只使用 adc 大概是採同樣的方法了吧!
畢竟看起來並沒有什麼便宜之處可撿.

提升 osc 能提升整個程式的執行速度嗎?
基本上當然是可以提升程式的執行速度,
但要記得你目前這一項,
它與 ADC 轉換時間有關係.
ADC 轉換時間比較少的話,
才真的更能加快你的 OCP 反應速度.

3月09日 16:51:11
轉換PDF檔 列印


Re: 如何寫多通道AD做過電壓保護中斷程式
初級會員
註冊日期:
1月05日 17:30:44
所屬群組:
註冊會員
文章: 34
等級: 4; EXP: 59
HP : 0 / 89
MP : 11 / 122
離線
現在有一根腳是用來偵測風扇速度 這樣可以並用auto conversion trigger嗎? 要用PSMx還是CCPx抓取和轉換比較適合?

3月09日 17:21:05
轉換PDF檔 列印


Re: 如何寫多通道AD做過電壓保護中斷程式
資深會員
註冊日期:
2012/05/04 19:18
所屬群組:
註冊會員
文章: 170
等級: 12; EXP: 9
HP : 0 / 277
MP : 56 / 4167
離線
若您的電路或負載撐不了數十us左右的大電流,我看你乾脆完全用硬體作保護比較好,先了解一下再來決定要多快比較洽當吧!

3月09日 17:22:01
轉換PDF檔 列印


Re: 如何寫多通道AD做過電壓保護中斷程式
初級會員
註冊日期:
2015/05/27 22:04
所屬群組:
註冊會員
文章: 32
等級: 4; EXP: 40
HP : 0 / 85
MP : 10 / 517
離線
引用:

ben.huang 寫道:
謝謝前輩 小弟才剛入行不久
所以有很多奇怪的問題 真是不好意思

所以就算用比較新的那顆 做法還是只能一樣嗎
因為似乎不會用到PSMx和CCPx這兩項
再請教一個問題 提升晶振頻率會提升整個程式執行速度嗎

ADCON2 的 TRIGSEL<3:0> 可以選用PSMCx的Period Match Event,利用恰當的PSMCx的週期設定,你就可以定期觸發ADC. 要活用硬體周邊,即使Microchip介紹PSMCx應用在馬達的控制,但我們還是可以拿來用在不同的場合。

3月09日 17:44:19
轉換PDF檔 列印


Re: 如何寫多通道AD做過電壓保護中斷程式
初級會員
註冊日期:
1月05日 17:30:44
所屬群組:
註冊會員
文章: 34
等級: 4; EXP: 59
HP : 0 / 89
MP : 11 / 122
離線
以下是配合mcc產生的adc.c修改的
MCU是使用PIC16F1786
這樣還要把adc 8個通道放在中斷裡面嗎
要怎麼樣才能配合PSMC1_Period_Match
不知道這樣是否正確 怎麼修改比較洽當呢
謝謝指點

MCC設定為
FOSC: 16MHz
ADC Clock: FOSC/16
Result Mode: 10bit Mode
Result Aligment: sign_magnitude
Auto Conversion Trigger: PSMC1_Period_Match
Voltage Ref: VDD(3.3V)、VSS


/**
  Section: Included Files
*/

#include <xc.h>
#include "adc.h"
#include "mcc.h"

/**
  Section: Macro Declarations
*/

#define ACQ_US_DELAY 5

/**
  Section: ADC Module APIs
*/

void ADC_Initialize(void)
{
    
// set the ADC to the options selected in the User Interface
    
    // ADRMD 10_bit_mode; GO_nDONE start; ADON enabled; CHS AN0;
    
ADCON0 = 0x83;
    
    
// ADFM sign_magnitude; ADNREF VSS; ADPREF VDD; ADCS FOSC/16;
    
ADCON1 = 0x50;
    
    
// TRIGSEL PSMC1_Period_Match; CHSN ADNREF;
    
ADCON2 = 0x4F;
    
    
// ADRESH 0;
    
ADRESH = 0x00;
    
    
// ADRESL 0;
    
ADRESL = 0x00;
    
    
// Enabling ADC interrupt.
    
PIE1bits.ADIE = 1;
}

void ADC_StartConversion(adc_channel_t channel)
{
    
// select the A/D channel
    
ADCON0bits.CHS = channel;

    
// Turn on the ADC module
    
ADCON0bits.ADON = 1;

    
// Acquisition time delay
    
__delay_us(ACQ_US_DELAY);
    
    
// Start the conversion
    
ADCON0bits.GO_nDONE = 1;
}

bool ADC_IsConversionDone()
{
    
// Start the conversion
    
return (!ADCON0bits.GO_nDONE);
}

adc_result_t ADC_GetConversionResult(void)
{
    
// Conversion finished, return the result
    
return ((ADRESH << 8) + ADRESL);
}

adc_result_t ADC_GetConversion(adc_channel_t channel)
{
    
// Select the A/D channel
    
ADCON0bits.CHS = channel;

    
// Turn on the ADC module
    
ADCON0bits.ADON = 1;

    
// Acquisition time delay
    
__delay_us(ACQ_US_DELAY);

    
// Start the conversion
    
ADCON0bits.GO_nDONE = 1;

    
// Wait for the conversion to finish
    
while (ADCON0bits.GO_nDONE)
    {
    }
    
    
// Conversion finished, return the result
    
return ((ADRESH << 8) + ADRESL);
}

unsigned char ADC_CH=0;
unsigned char ADC_count=0;
unsigned int ADC_SUM=0;
unsigned char CH0_ADC=0;
unsigned char CH1_ADC=0;
unsigned char CH2_ADC=0;
unsigned char CH3_ADC=0;
unsigned char CH4_ADC=0;
unsigned char CH5_ADC=0;
unsigned char CH6_ADC=0;
unsigned char CH7_ADC=0;

void ADC_ISR(void)
{
    if(
ADC_count > 1) ADC_SUM = ADC_SUM + ADRESH;
    else
ADC_SUM = 0;

    
ADC_count++;
    if(
ADC_count >= 6)
        {
            
ADC_count = 0;
            
ADC_SUM >>= 2; // average (1/4)
            
ADCON1 = 0x50;
            switch(
ADC_CH)
            {
            
/******************************+24V3_PG***********************************/
            
case 0:
            
ADCON0bits.CHS = P24V3_PG; //Prepare next A/D conversion, select AN1 channel
            
CH0_ADC = ADC_SUM;
            break;
            
/******************************+24V_OCP***********************************/
            
case 1:
            
ADCON0bits.CHS = P24V_OCP; //Prepare next A/D conversion, select AN2 channel
            
CH1_ADC = ADC_SUM;

            if(
CH1_ADC>695)  //2.24V
                
ENPOWER_N_24V_SetLow();
            else
                
ENPOWER_N_24V_SetHigh();
            break;
            
/******************************+12VAU_OCP***********************************/
            
case 2:
            
ADCON0bits.CHS = P12VAU_OCP; //Prepare next A/D conversion, select AN10 channel
            
CH2_ADC = ADC_SUM;

            if(
CH2_ADC>86)    //0.28V
                
ENPOWER_N_12V_SetLow();
            else
                
ENPOWER_N_12V_SetHigh();
            break;
            
/******************************+12VPC_OCP***********************************/
            
case 3:
            
ADCON0bits.CHS = P12VPC_OCP; //Prepare next A/D conversion, select AN8 channel
            
CH3_ADC = ADC_SUM;

            if(
CH3_ADC>521) //1.68V
                
ENPOWER_N_12V_SetLow();
            else
                
ENPOWER_N_12V_SetHigh();
            break;
            
/******************************+12V_SENSE***********************************/
            
case 4:
            
ADCON0bits.CHS = P12V_SENSE; //Prepare next A/D conversion, select AN9 channel
            
CH4_ADC = ADC_SUM;
            break;
            
/******************************+5VAU_OCP***********************************/
            
case 5:
            
ADCON0bits.CHS = P5VAU_OCP; //Prepare next A/D conversion, select AN11 channel
            
CH5_ADC = ADC_SUM;

            if(
CH5_ADC>260) //0.84V
                
ENPOWER_N_5V_SetLow();
            else
                
ENPOWER_N_5V_SetHigh();
            break;
            
/******************************+5VPC_OCP***********************************/
            
case 6:
            
ADCON0bits.CHS = P5VPC_OCP; //Prepare next A/D conversion, select AN13 channel
            
CH6_ADC = ADC_SUM;

            if(
CH6_ADC>521) //1.68V
                
ENPOWER_N_5V_SetLow();
            else
                
ENPOWER_N_5V_SetHigh();
            break;
            
/******************************+5V_SENSE***********************************/
            
case 7:
            
ADCON0bits.CHS = P5V_SENSE; //Prepare next A/D conversion, select AN0 channel
            
CH7_ADC = ADC_SUM;
            break;
            
ADC_CH=-1;
            }
        
ADC_CH++;
        
PIR1bits.ADIF = 0;     // Clear the ADC interrupt flag
        
ADCON0bits.GO_nDONE=1; //Start A/D Conversion
        
}
    
    
}
/**
End of File
*/

3月29日 16:55:04

ben.huang 於 2017年03月29日 17:17:43
ben.huang 於 2017年03月29日 17:22:48
轉換PDF檔 列印



« 1 2 3 (4)



無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
線上教學影片
網頁捷徑
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project