2016-12-07 9 views
-1
while(1) 
{ 
    for(x=0;x<5;) //note: x is incremented elsewhere 
    { 
     DAC->DHR12R1 = (uint16_t)(x/5.0*4095*3.0/3.3); 
    } 
} 

что делает этот цикл означает? Я знаю, что DHR12R1 удерживаются данные регистра 12bits праваЧто означает этот код?

+0

Похоже, бесконечный цикл для меня. – DrPepperJo

+0

ну, я просто не понимаю, что такое 5.0, 4095 и 3.0. что означают эти цифры? –

+0

4096 = 2^12 - 1, наибольшее число, которое может быть представлено 12-битным без знака. Не знаю об остальном, вам нужно будет предоставить дополнительную информацию. – DrPepperJo

ответ

0

Я превратил его в стандартную программу C, чтобы увидеть, какие значения записываются в Регистр ЦАП.

#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 Channel 1 Data Output регистр DAC->DOR1 и преобразуется в напряжение по формуле

U=Vref*DAC->DOR1/4095 

Так , если ваш Vref равен 3 вольтам, тогда вы получите 0 вольт при x = 0, 0,545 вольт при x = 1 и т. д.

Примечание. Я предположил, что в некотором обработчике прерываний x увеличивается на 1, тогда x может быть кратко установлен на 5 до того, как он будет сброшен на 0. Если его можно увеличить на произвольные значения или это прерывание может произойти более одного раза на итерации цикла, тогда результат будет обтекаться на 4096. Это означает, что выходное напряжение будет обычно падать между GND и 0.727*Vref, при этом короткие короткие всплески выше этого. Обратите внимание также, что если два приращения ocuur в короткой последовательности в неподходящий момент, один до x<5 проверяется, а другой справа после этого, до выполнения x=0, один импульс будет потерян.

Поэтому следует рассмотреть вопрос о переходе на проверку предела в ПРЕРЫВАЙТЕ, где происходит приращение, как

x = (x + 1) % 5;