工具/软件:Code Composer Studio
IAM 在动态电压修复器上执行一个项目、为此、我需要对控制器进行编码、这样控制器就必须从230/3V 变压器获取模拟输入。 为此、我检查了 ADSOC 示例、它在3.3V 的电池电压下运行良好、提供4096作为值输出。 但是、当我通过更换变压器来检查它时、因为这里的输入是交流电、它只是从0到4096波动。 现在、我的问题是、我需要在添加观察表达式区域时读取一个常量值。 这是我针对我的应用修改的代码。 如果需要对其进行任何更改、请向我提供建议。 这里的代码是、它必须读取输入模拟值并相应地生成脉冲。
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
#include "F2802x_common/include/adc.h"
#include "F2802x_common/include/clk.h"
#include "F2802x_common/include/flash.h"
#include "F2802x_common/include/gpio.h"
#include "F2802x_common/include/PIE.h"
#include "F2802x_common/include/PLL.h"
#include "F2802x_common/include/PWM.h"
#include "F2802x_common/include/wdog.h"
//此文件中找到的函数的原型语句。
中断空 ADC_ISR (空);
void ADC_Config (void);
//此示例中使用的全局变量:
uint16_t Voltage1;
uint16_t Voltage2;
浮点结果;
uint16_t temp;
adc_handle myAdc;
clk_handle myClk;
Flash_handle myFlash;
GPIO_Handle myGpio;
PIE_Handle myPie;
PWM_Handle myPwm1;
void main (void)
{
cpu_handle myCpu;
pll_handle myPll;
WDOG_Handle myWDog;
//初始化此应用程序所需的所有句柄
myAdc = ADC_init ((void *) ADC_base_ADDR、sizeof (ADC_Obj));
myClk = CLK_init ((void *) CLK_base_ADDR、sizeof (CLK_Obj));
myCpu = cpu_init ((void *) NULL、sizeof (cpu_Obj));
myFlash = flash_init ((void *) flash_base_ADDR、sizeof (flash_Obj));
myGpio = GPIO_init ((void *) GPIO_base_ADDR、sizeof (GPIO_Obj));
myPie = PI_init ((void *) PIE_BASE_ADDR、sizeof (PIE_Obj));
myPll = PLL_init ((void *) PLL_base_ADDR、sizeof (PLL_Obj));
myPwm1 = PWM_init ((void *) PWM_ePWM1_base_ADDR、sizeof (PWM_Obj));
myWdDog = WDOG_INIT ((void *) WDOG_BASE_ADDR、sizeof (WDOG_Obj));
//执行基本系统初始化
WDOG_DISABLE (myWDog);
CLK_enableAdcClock (myClk);
(*Device_cal)();
//选择内部振荡器1作为时钟源
CLK_setOscSrc (myClk、CLK_OscSrc_Internal);
//将 PLL 设置为 x12/2、这样将产生60MHz = 10MHz * 12/2
PLL_setup (myPll、PLL_Multiplier_12、PLL_DivideSelect_CLKIN_BY_2);
//禁用 PIE 和所有中断
PIE_DISABLE (myPie);
PI_DisableAllInts (myPie);
CPU_disableGlobalInts (myCpu);
CPU_clearIntFlags (myCpu);
//如果从闪存运行,则只将 RAM 复制到 RAM
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif
//设置调试矢量表并启用 PIE
PI_setDebugIntVectorTable (myPie);
PIE_ENABLE (myPie);
//在 PIE 矢量表中注册中断处理程序
PI_registerPieIntHandler (myPie、PI_GroupNumber_10、PI_SubGroupNumber_1、(intVec_t)&ADC_ISR);
//初始化 ADC
adc_enableBandGap (myAdc);
ADC_enableRefBuffers (myAdc);
ADC_POWERUP (myAdc);
ADC_ENABLE (myAdc);
ADC_setVoltRefSrc (myAdc、ADC_VoltageRefSrc_Int);
//在 PIE 中启用 ADCINT1
PIE_enableAdcInt (myPie、ADC_IntNumber_1);
//启用 CPU 中断1
CPU_enableInt (myCpu、CPU_IntNumber_10);
//启用全局中断 INTM
cpu_enableGlobalInts (myCpu);
//启用全局实时中断 DBGM
CPU_enableDebugInt (myCpu);
//配置 ADC
//注意:通道 ADCINA4将被双采样以解决修订版0器件勘误表中的 ADC 第一个采样问题
ADC_setIntPulseGenMode (myAdc、ADC_IntPulseGenMode_Prior);//ADCINT1在 AdcResults 锁存后跳闸
ADC_enableInt (myAdc、ADC_IntNumber_1);//启用 ADCINT1
ADC_setIntMode (myAdc、ADC_IntNumber_1、ADC_IntMode_ClearFlag);//禁用 ADCINT1连续模式
ADC_setIntSrc (myAdc、ADC_IntNumber_1、ADC_IntSrc_EOC2);//设置 EOC2以触发 ADCINT1触发
ADC_setSockChanNumber (myAdc、ADC_SockNumber_0、ADC_SockChanNumber_A4);//将 SOC0通道选择设置为 ADCINA4
ADC_setSockChanNumber (myAdc、ADC_SockNumber_1、ADC_SockChanNumber_A4);//将 SOC1通道选择设置为 ADCINA4
ADC_setSockChanNumber (myAdc、ADC_SockNumber_2、ADC_SockChanNumber_A2);//将 SOC2通道选择设置为 ADCINA2
ADC_setSockTrigSrc (myAdc、ADC_SockNumber_0、ADC_SockTrigSrc_EPWM1_ADCSOCA);//设置 EPWM1A 上的 SOC0启动触发器、由于轮询 SOC0先转换、然后 SOC1
ADC_setSockTrigSrc (myAdc、ADC_SockNumber_1、ADC_SockTrigSrc_EPWM1_ADCSOCA);//设置 EPWM1A 上的 SOC1启动触发器,由于轮询 SOC0先转换,然后 SOC1
ADC_setSockTrigSrc (myAdc、ADC_SockNumber_2、ADC_SockTrigSrc_EPWM1_ADCSOCA);//设置 SOC2在 EPWM1A 上启动触发、因为轮询 SOC0先转换 SOC1、然后转换 SOC2
ADC_setSockSampleWindow (myAdc、ADC_SockNumber_0、ADC_SockSampleWindow_7_cycles);//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
ADC_setSockSampleWindow (myAdc、ADC_SockNumber_1、ADC_SockSampleWindow_7_cycles);//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
ADC_setSockSampleWindow (myAdc、ADC_SockNumber_2、ADC_SockSampleWindow_7_cycles);GPIO_setMode (myGpio、GPIO_Number_0、 GPIO_0_Mode_generalpurpose);
GPIO_setDirection (myGpio、GPIO_Number_0、GPIO_Direction_Output);
GPIO_setMode (myGpio、GPIO_Number_1、GPIO_1_Mode_generalpurpose);
GPIO_setDirection (myGpio、GPIO_Number_1、GPIO_Direction_Output);
GPIO_setMode (myGpio、GPIO_Number_2、GPIO_2_Mode_generalpurpose);
GPIO_setDirection (myGpio、GPIO_Number_2、GPIO_Direction_Output);
GPIO_setMode (myGpio、GPIO_Number_3、GPIO_3_Mode_generalpurpose);
GPIO_setDirection (myGpio、GPIO_Number_3、GPIO_Direction_Output);
GPIO_setHigh (myGpio、GPIO_Number_0);
GPIO_setHigh (myGpio、GPIO_Number_1);
GPIO_setHigh (myGpio、GPIO_Number_2);
GPIO_setHigh (myGpio、GPIO_Number_3);
DELAY_US (20000);
//将 SOC2 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)
//启用 PWM 时钟
CLK_enablePwmClock (myClk、PWM_NUMBER_1);
//设置 PWM
PWM_enableSockpulse (myPwm1);//在组上启用 SOC
PWM_setSockAPulseSrc (myPwm1、PWM_SockPulseSrc_CounterEqualCmpAIncr);//从 CPMA 中选择 SOC (向上计数)
PWM_setSockAPeriod (myPwm1、PWM_SockPeriod_FirstEvent);//在第1个事件发生时生成脉冲
PWM_setCmpA (myPwm1、0x0080);//设置比较值
PWM_setPeriod (myPwm1、0xFFFF);//设置 ePWM1的周期
PWM_setCounterMode (myPwm1、PWM_CounterMode_Up);//递增计数并启动
CLK_enableTbClockSync (myClk);
while (1)
{
}
//等待 ADC 中断
}
中断空 ADC_ISR (空)
{
//将 ADCRESULT0作为修订版0第一个样本勘误表权变措施的一部分丢弃
Voltage1 = ADC_readResult (myAdc、ADC_ResultNumber_1);
Voltage2 = ADC_readResult (myAdc、ADC_ResultNumber_2);
Result=(Voltage1)/(1241.2121);
if (result>=3.2)
{
TEME=0;
}
其他
{
temp=((3.2-结果)*8000)/(3.2);
}
//清除 ADCINT1标志为下一个 SOC 重新初始化
int i;
int j;
I=10000;
J=I-temp;
GPIO_setHigh (myGpio、GPIO_Number_0);
GPIO_setHigh (myGpio、GPIO_Number_1);
DELAY_US (temp);
GPIO_setLow (myGpio、GPIO_Number_0);
GPIO_setLow (myGpio、GPIO_Number_1);
DELAY_US (j);
GPIO_setHigh (myGpio、GPIO_Number_2);
GPIO_setHigh (myGpio、GPIO_Number_3);
DELAY_US (temp);
GPIO_setLow (myGpio、GPIO_Number_2);
GPIO_setLow (myGpio、GPIO_Number_3);
DELAY_US (j);
//如果记录了10次转换,则重新开始
//清除 ADCINT1标志为下一个 SOC 重新初始化
ADC_clearIntFlag (myAdc、ADC_IntNumber_1);
//确认 PIE 中断
PI_clearInt (myPie、PI_GroupNumber_10);
返回;
}
int j;
I=10000;
J=I-temp;
GPIO_setHigh (myGpio、GPIO_Number_0);
GPIO_setHigh (myGpio、GPIO_Number_1);
DELAY_US (temp);
GPIO_setLow (myGpio、GPIO_Number_0);
GPIO_setLow (myGpio、GPIO_Number_1);
DELAY_US (j);
GPIO_setHigh (myGpio、GPIO_Number_2);
GPIO_setHigh (myGpio、GPIO_Number_3);
DELAY_US (temp);
GPIO_setLow (myGpio、GPIO_Number_2);
GPIO_setLow (myGpio、GPIO_Number_3);
DELAY_US (j);
//如果记录了10次转换,则重新开始
//清除 ADCINT1标志为下一个 SOC 重新初始化
ADC_clearIntFlag (myAdc、ADC_IntNumber_1);
//确认 PIE 中断
PI_clearInt (myPie、PI_GroupNumber_10);
返回;
}
