转换为6位

标签 c embedded adc analog-digital-converter

我正在尝试整理这个将 10 位值转换为 6 位值的函数。当我使用更高分辨率的 ADC 时,我还需要能够定义输入的位长度:

BYTE ioGetADC (void)                
 {
  BYTE r;

  ConvertADC();              // Start Conversion
  while(BusyADC());              // Wait for completion
   {
    r = ( (ReadADC())/16);          // Read result and convert to 0-63 (returns 10bit right hand justified)
   }

  return r;
 }

最佳答案

构建于 Joachim's answer ,怎么样:

uint32_t dropBits(uint32_t x, uint8_t bitsIn, uint8_t bitsOut)
{
  return x / (1 << (bitsOut - bitsIn));
}

例如,如果我们调用 dropBits(1023, 10, 6)要将 10 位整数的最大值缩放为 6 位,它将返回 1023 / (1 << 4)这是 1023 / 16即 63,6 位值的最大值。

当然,我们可能会想要帮助编译器,因为分母是 2 的幂:

return x >> (bitsOut - bitsIn);

这会删除除法运算符,而是直接使用移位来实现。

请注意,这只能删除位,它不能将值缩放为更多位。

关于转换为6位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17444941/

相关文章:

c++ - 计算嵌入式C中代码块的时钟周期

c - 将结构数据保存到 void* 变量

c - 与 PIC18F252 上的 ADC 输出作斗争

linux - 如何将 MCP23017 与 MCP3008 一起用于 Raspberry Pi 的 I2C 电压传感器?

c - fork 和 exec 与锁定共享内存相关 - C

c - 如何在C中将多个函数分组以折叠

c - 加载由 malloc 分配的数组时发生访问冲突?

c - STM32和4线电阻触摸屏

c - DQBUF 的 ioctl 的 V4L2 无效参数

c - STM32F746NG-发现: Program Stuck after first ADC read