📄 f281xileg.c
字号:
/* ==================================================================================
File name: F281XILEG.C
Description: This file contains source for the F281X Two leg current measurement driver.
=====================================================================================*/
#include "DSP281x_Device.h"
#include "f281xileg.h"
#define CPU_CLOCK_SPEED 6.6667L // 150MHz CPU 时钟频率
#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_drv_init(ILEG2MEAS *p)
{
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; // 复位 ADC 模块
asm(" NOP ");
asm(" NOP ");
AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // 使能其他电路
DELAY_US(ADC_usDELAY); // 延时等待
AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // 使能 ADC
AdcRegs.ADCTRL3.bit.ADCCLKPS = 6; // 设置 ADCTRL3 寄存器
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE_ILEG2; // 设置 ADCTRL1寄存器
AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE_ILEG2; // 设置ADCTRL2 寄存器r
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 1;
AdcRegs.ADCCHSELSEQ1.all = p->ChSelect; // 配置通道选择
EvaRegs.GPTCONA.bit.T1TOADC = 1; // 设置ev触发为timer1下溢中断
}
void F281X_ileg2_drv_read(ILEG2MEAS *p)
{
int16 DatQ15;
int32 Tmp;
// Wait until ADC conversion is completed
while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)
{};
DatQ15 = AdcRegs.ADCRESULT0^0x8000; // 转换结果为Q15格式
Tmp = (int32)p->ImeasAGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->ImeasA = (int16)(Tmp>>13); // 转变 Q28 to Q15
p->ImeasA += p->ImeasAOffset; // 增加偏移量
p->ImeasA *= -1; // 取反方向,电流流向电机
DatQ15 = AdcRegs.ADCRESULT1^0x8000;
Tmp = (int32)p->ImeasBGain*(int32)DatQ15;
p->ImeasB = (int16)(Tmp>>13);
p->ImeasB += p->ImeasBOffset;
p->ImeasB *= -1;
p->ImeasC = -(p->ImeasA + p->ImeasB); // 计算c相电流
AdcRegs.ADCTRL2.all |= 0x4040; // 保存结果
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -