?? f281xileg_vdc.c
字號:
/* ==================================================================================
File name: F281XILEG_VDC.C
Originator: Digital Control Systems Group
Texas Instruments
Description: This file contains source for the F281X Two leg current measurement
and DC-bus measurement driver.
Target: TMS320F281x family
=====================================================================================
History:
-------------------------------------------------------------------------------------
04-15-2005 Version 3.20: Using DSP281x v. 1.00 or higher
----------------------------------------------------------------------------------*/
#include "DSP281x_Device.h"
#include "f281xileg_vdc.h"
#define CPU_CLOCK_SPEED 6.6667L // for a 150MHz CPU clock speed
#define ADC_usDELAY 5000L
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L)
extern void DSP28x_usDelay(unsigned long Count);
void F281X_ileg2_dcbus_drv_init(ILEG2DCBUSMEAS *p)
{
DELAY_US(ADC_usDELAY); //延時5us
AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; //復位ADC模塊
asm(" NOP ");
asm(" NOP ");
AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // Power up bandgap/reference circuitry
DELAY_US(ADC_usDELAY); // Delay before powering up rest of ADC
AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // Power up rest of ADC
AdcRegs.ADCTRL3.bit.ADCCLKPS = 6; //ADCLK=12.5MHZ
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all |= ADCTRL1_INIT_STATE; //仿真掛起被忽略;采集窗口為2個ADCLK周期數;AD時鐘不再進行二分頻了;級聯模式
AdcRegs.ADCTRL2.all |= ADCTRL2_INIT_STATE; //允許EVA啟動級聯模式的SEQ
AdcRegs.ADCMAXCONV.bit.MAX_CONV1|= 0x0003; //用4個轉換通道
AdcRegs.ADCCHSELSEQ1.all = p->ChSelect; //Ia:通道0;Ib:通道1;Ic:通道2;vsense:通道3
EvaRegs.GPTCONA.bit.T1TOADC = 1; //用T1的下溢中斷啟動ADC
}
void F281X_ileg2_dcbus_drv_read(ILEG2DCBUSMEAS *p)
{
int16 DatQ15;
int32 Tmp;
// Wait until ADC conversion is completed
while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)
{};
//Ia,正數,電流流向電機,-1~+1代表-25A~25A
DatQ15 = AdcRegs.ADCRESULT0^0x8000; // ^按位異或,將轉換結果轉換為Q15格式的雙極性數據
Tmp = (int32)p->ImeasAGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->ImeasA = (int16)(Tmp>>13); // Convert Q28 to Q15
p->ImeasA += p->ImeasAOffset; // Add offset
p->ImeasA *= -1; // 正數,電流流向電機,-1~+1代表-25A~25A
//Ib,正數,電流流向電機,-1~+1代表-25A~25A
DatQ15 = AdcRegs.ADCRESULT1^0x8000; // Convert raw result to Q15 (bipolar signal)
Tmp = (int32)p->ImeasBGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->ImeasB = (int16)(Tmp>>13); // Convert Q28 to Q15
p->ImeasB += p->ImeasBOffset; // Add offset
p->ImeasB *= -1; // Positive direction, current flows to motor
//Ic,正數,電流流向電機,-1~+1代表-25A~25A,是計算出來的,不是由ADCRESULT3讀出的
p->ImeasC = -(p->ImeasA + p->ImeasB); // Compute phase-c current
//VSENSE,0代表0V,1代表5V
DatQ15 = (AdcRegs.ADCRESULT3>>1)&0x7FFF; // 轉化為Q15單極性,范圍為[0,1)
Tmp = (int32)p->VdcMeasGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
if (Tmp > 0x0FFFFFFF) // Limit Tmp to 1.0 in Q28
Tmp = 0x0FFFFFFF;
p->VdcMeas = (int16)(Tmp>>13); // Convert Q28 to Q15
p->VdcMeas += p->VdcMeasOffset; // Add offset
AdcRegs.ADCTRL2.all |= 0x4040; // Reset the sequence
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -