Код: Выделить всё
union {u16 i; u8 c[2];} pw;
pw.i = pid->fout * MAXPULSEDURATION;
pid->pwrOutput = pw.c[1];primuss3.com
Код: Выделить всё
union {u16 i; u8 c[2];} pw;
pw.i = pid->fout * MAXPULSEDURATION;
pid->pwrOutput = pw.c[1];Код: Выделить всё
При тактовой частоте 1МГц, ICR1H=0 ICR1L=250 2000Гц
При тактовой частоте 1МГц, ICR1H=0 ICR1L=100 5000ГцКод: Выделить всё
АЦП=0 соответствует ICR1L=250 2000Гц
АЦП=255 соответствует ICR1L=100 5000ГцКод: Выделить всё
y=−0.5882352941176471x+250Код: Выделить всё
period_temp2 = (uint16_t) ((int32_t) ((int32_t)period_temp * (-0.5882352941176471)) + 250);
pulsewidth_temp2 = (uint16_t) ((uint32_t) ((uint32_t)pulsewidth_temp * (uint32_t)period_temp2)/256);
Точно! Максимальный период в режиме 8 равен 131 070. Упустил этот момент.Starichok51 писал(а):режим №8 работает "туда и обратно".
когда ICR1 равно 256, количество тиков равно 512.
Код: Выделить всё
period_temp2 = (uint16_t) ((uint32_t) ((uint32_t)period_temp * 0x10000)/256);Код: Выделить всё
period_temp2 = (uint16_t)period_temp * (0x10000/256);0x10000 и 256 красивые числа, компилятор наверняка их сократит.Kalisnik писал(а):Дополнительные преобразования типов наверняка отнимают время?
так и писал бы тогда их красиво: 0x10000 и 0x100Dimon456 писал(а):0x10000 и 256 красивые числа
Dimon456 писал(а):у меня было три диапазона: 0x10000 0x1000 и 0x100
опять ТС решает задачу через жKalisnik писал(а):В дадашите рекомендуют при часто меняющейся частоте
Код: Выделить всё
volatile uint8_t period = 214;
OCR1A = (uint16_t)(((period * 257)/4) + 5600);slav0n писал(а):решает задачу через ж
патамушо написано через жKalisnik писал(а):Почему в этом примере вместо ожидаемого результата 19 349, получается 150?
А за чем нам еще нужно приведение типов?Kalisnik писал(а):Почему в этом примере вместо ожидаемого результата 19 349, получается 150?
Код: Выделить всё
OCR1A = (uint16_t)((((uint32_t)period * 257)/4) + 5600);