while(1)
{
for(x=0;x<5;) //note: x is incremented elsewhere
{
DAC->DHR12R1 = (uint16_t)(x/5.0*4095*3.0/3.3);
}
}
をこのループは何を意味するのでしょうか?私は値が書き込まれているものを参照するために、標準のCプログラムにそれを変換しましたDHR12R1が右このコードは何を意味するのでしょうか?
while(1)
{
for(x=0;x<5;) //note: x is incremented elsewhere
{
DAC->DHR12R1 = (uint16_t)(x/5.0*4095*3.0/3.3);
}
}
をこのループは何を意味するのでしょうか?私は値が書き込まれているものを参照するために、標準のCプログラムにそれを変換しましたDHR12R1が右このコードは何を意味するのでしょうか?
データ保持レジスタ12bitsである知っていますDACレジスタ。
#include <stdio.h>
#include <stdint.h>
int x;
int main() {
for(x=0;x<=5;x++) // Why x <= 5? See note at bottom
printf("x=%d DAC->DHR12R1=%u\n", x, (uint16_t)(x/5.0*4095*3.0/3.3));
return 0;
}
出力:
$ gcc -Wall -Wextra dac.c -o dac && ./dac
x=0 DAC->DHR12R1=0
x=1 DAC->DHR12R1=744
x=2 DAC->DHR12R1=1489
x=3 DAC->DHR12R1=2233
x=4 DAC->DHR12R1=2978
x=5 DAC->DHR12R1=3722
この値は、最終的にはDACチャネル1のデータ出力レジスタDAC->DOR1
になってしまいますし、だから、式
U=Vref*DAC->DOR1/4095
に応じた電圧に変換されますあなたのVrefが3ボルトの場合、x = 0で0ボルト、x = 1で0.545ボルトなどを得ます。
注:いくつかの割り込みハンドラでxが1ずつインクリメントされると仮定しましたが、xは5にリセットされる前に一時的に5に設定できます。任意の値でインクリメントできるか、ループごとに繰り返すと、結果は4096でラップアラウンドします。つまり、出力電圧は通常、GND
と0.727*Vref
の間にあり、時折短いスパイクを上回ります。 また、間違った瞬間に2つのインクリメントが連続して発生した場合は、x<5
より前のものがチェックされ、その直後ではx=0
が実行される前に1つのパルスが失われます。
したがって、あなたは私には無限ループのように見える
x = (x + 1) % 5;
のように、 増分が発生しinteruptに制限チェックを移動することを検討すべきです。 – DrPepperJo
まあ、私はちょうど5.0、4095と3.0何を理解していない。これらの数字は何を意味しますか? –
4096 = 2^12 - 1、符号なし12ビットで表現できる最大の数。残りの部分について知りません、より多くの情報を提供する必要があります。 – DrPepperJo