2

Cコードに問題があります。使用している PWM をシャットダウン (トリップ ゾーン) するかどうかを決定するために使用される ADC があります。しかし、ADC が間違った電圧レベルで PWM をシャットダウンするため、私の計算は意図したとおりに機能しないようです。変数を次のように開始します。

float32 current = 5;
Uint16 shutdown = 0;

そして、私は次のように計算します:

// Save the ADC input to variable
adc_info->adc_result0 = AdcRegs.ADCRESULT0>>4;              //bit shift 4 steps because adcresult0 is effectively a 12-bit register not 16-bit, ADCRESULT0 defined as Uint16

current = -3.462*((adc_info->adc_result0/1365) - 2.8);

// Evaluate if too high or too low
if(current > 9 || current < 1)
{
    shutdown = 1;
}
else
{
    shutdown = 0;
}

その後、この if ステートメントを使用します。

if(shutdown == 1)
{
    EALLOW;                                                 // EALLOW protected register
    EPwm1Regs.TZFRC.bit.OST = 1;                // Force a one-shot trip-zone interrupt
    EDIS;                                                   // end write to EALLOW protected register
}

そのため、電流が 9 を超えるか 1 を下回る場合、PWM をトリップさせたいと考えています。これは、それぞれ <273 (0x111) および >3428 (0xD64) の ADC 結果と一致するはずです。ADC 値は、それぞれ電圧 0.2V と 2.51V に対応します。ADC は、電圧 0 と 3V の間を 12 ビット精度で測定します。

しかし、そうではありません。代わりに、トリップ ゾーンは約 1V と 2.97V でオフになります。それで、私は何を間違っていますか?

4

1 に答える 1

4
adc_info->adc_result0/1365

ここで浮動小数点数を仮定して整数除算を行いましたか?

この修正を試してください:

adc_info->adc_result0/1365.0

また、@pmgの提案は良いです。ADC 値を既知の境界と即座に比較できるのに、なぜ電圧の計算にサイクルを費やすのでしょうか?

if (adc_info->adc_result0 < 273 || adc_info->adc_result0 > 3428)
{
    shutdown = 1;
}
else
{
    shutdown = 0;
}

計算された境界をハードコードしたくない場合 (これは完全に理解できます)、文字通りハードコードしたい値から計算されたものとして定義します。

#define VOLTAGE_MIN 0.2
#define VOLTAGE_MAX 2.51
#define AREF 3.0
#define ADC_PER_VOLT (4096 / AREF)

#define ADC_MIN (VOLTAGE_MIN * ADC_PER_VOLT) /* 273 */
#define ADC_MAX (VOLTAGE_MAX * ADC_PER_VOLT) /* 3427 */

/* ... */
    shutdown = (adcresult < ADC_MIN || adcresult > ADC_MAX) ? 1 : 0;
/* ... */

C の整数除算規則を確実に把握したら、コード スタイルに少し追加することを検討してください。定数係数と除数を常に 10 進数で記述し10.0ます10(確実に浮動小数点型になるようにするため)。切り捨てによる整数除算を特に意味しない限り。場合によっては、適切な接尾辞を付けてfloat リテラルの精度を指定することをお勧めします。

于 2014-04-09T11:14:38.033 に答える