【无标题】

pll phase locked loop 锁相环 (倍频器)

prescale(分频器)

主机发从机收,不考虑ack,nack

逐次逼近(Successive Approximation)ADC(模数转换器)是一种常用的模数转换技术,它通过一系列比较步骤来确定输入模拟信号的数字表示。逐次逼近ADC因其较高的速度、较低的成本和较好的精度而在许多应用中得到了广泛的应用。逐次逼近ADC的工作原理逐次逼近ADC的基本工作流程如下:1. 初始化:•将逐次逼近寄存器(SAR,Successive Approximation Register)的所有位都设置为0。2. 最高有效位(MSB)开始:•从最高有效位(MSB)开始,将该位置1,然后将逐次逼近寄存器中的值转换成相应的模拟电压,通过DAC(数模转换器)输出并与输入的模拟信号进行比较。3. 比较过程:•如果DAC输出的模拟电压小于输入的模拟电压,则保留逐次逼近寄存器中的当前位设置;•如果DAC输出的模拟电压大于输入的模拟电压,则将该位置0,并继续向下一个比特位进行比较。4. 重复上述步骤:•继续对下一个比特位进行同样的操作,直到最低有效位(LSB)为止。5. 转换完成:•当所有位都被评估完毕后,逐次逼近寄存器中的值即为输入模拟信号的数字表示。逐次逼近ADC的特点•速度快:逐次逼近ADC每次只进行一位的比较,因此在每个时钟周期可以转换一位,使得整个转换过程相对快速。•结构简单:逐次逼近ADC的硬件实现相对简单,只需要一个比较器和一个简单的控制逻辑。•功耗适中:相比ΣΔ(Sigma-Delta)转换器,逐次逼近ADC功耗较低;但相比于闪速(Flash)转换器,功耗又较高。逐次逼近ADC的应用逐次逼近ADC适合用于需要较高转换速率且对成本敏感的应用场景,如:•工业控制系统•测量仪器•数据采集系统•通信系统逐次逼近ADC的一个简单例子下面是一个简化的逐次逼近ADC的示例,假设我们正在使用一个8位的ADC,并且输入信号范围是从0V到5V。1. 初始化逐次逼近寄存器为00000000。2. 设置最高位为1,得到10000000,转换成模拟电压2.5V,与输入信号比较。3. 如果输入信号大于2.5V,则保留最高位为1;否则清零,并继续对下一位进行操作。4. 重复上述步骤,直到最低位。5. 最终得到的逐次逼近寄存器的值即为输入信号的数字表示。结论逐次逼近ADC因其高效、准确和易于实现的优点,在许多电子设备中被广泛采用。它通过逐步逼近的方式,最终确定输入模拟信号的数字值。如果您需要更详细的解释或者有关逐次逼近ADC的实际应用案例,请告诉我。

二进制数字如何表现采样值1. 量化单位(Quantization Step):•每个二进制位代表的电压范围取决于ADC的分辨率(位数)和满量程电压范围。例如,一个8位ADC的满量程电压为5V,那么每个量化单位为 。2. 电压到数字的映射:•输入电压通过逐次逼近的过程被映射到了一个特定的二进制数字上,这个数字代表了最接近输入电压的量化单位。•例如,如果输入电压为3.5V,那么8位ADC将输出一个大约为 (二进制表示)。示例假设我们有一个8位的逐次逼近ADC,满量程电压为5V。•输入电压为3.5V。•量化单位为 。•3.5V对应的量化值约为 ,取整为179。•179的二进制表示为 ( 10110011 )。因此,3.5V的输入电压会被转换为8位的二进制数字 ( 10110011 ),这就是逐次逼近ADC如何将模拟信号转换为数字信号,并表现采样值的过程。

1.步进电机在3D打印上用的比较多,因为步长是固定的,因此能够精准的控制转动产生的位移

  

(DC 5V 4相8拍5线步进电机 28YBJ-48 / 驱动芯片型号:uln2003芯片)

2.驱动原理

                                                        

3.驱动时序

3.1 4相8拍

3.2 4相单4拍

3.3 4相双4拍

4.参考代码(4相8拍,使用52840芯片驱动,使用P0.13、P0.14、P0.15、P0.16)

uint32_t control_IO[8] = {0x2000, 0x6000, 0x4000, 0xC000, 0x8000, 0x18000, 0x10000, 0x12000};  //顺时针旋转     
4.1 控制步进电机正反转

static void demo1(void) {
  NRF_LOG_INFO("Demo 1 循环5次正反转后停止");
  uint16_t i,j;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 512; i++) {
      for (j = 0; j < 8; j++) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(1);
      }
    }
    NRF_P0->OUT = 0x00;
    nrf_delay_ms(500);
    for (i = 0; i < 512; i++) {
      for (j = 7; j > 0; j--) {
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(1);
      }
    }
    NRF_P0->OUT = 0x00;
    nrf_delay_ms(500);
    if(++count == 5)
    {
      break;
    }
  }
}
4.2 控制电机减速旋转

static void demo2(void) 
{
  NRF_LOG_INFO("Demo 2/减速旋转5次后停止");
  uint16_t i,j;
  uint16_t speed = 1;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 512; i++) {
      for (j = 0; j < 8; j++) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(speed);
      }
    }
    NRF_P0->OUT = 0x00;
    if(speed < 3)
    {
      speed++;
      nrf_delay_ms(500);
    }
    else
    {
      speed = 1;
    }
    if(++count == 5)
    {
      break;
    }
  }
}
4.3控制电机加速旋转

static void demo3(void) 
{
  NRF_LOG_INFO("Demo 3/加速旋转5次后停止");
  uint16_t i,j;
  uint16_t speed = 3;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 512; i++) {
      for (j = 0; j < 8; j++) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(speed);
      }
    }
    NRF_P0->OUT = 0x00;
    if(speed > 0)
    {
      speed--;
      nrf_delay_ms(500);
    }
    else
    {
      speed = 3;
    }
    if(++count == 5)
    {
      break;
    }
  }
}

4.4 逆时针旋转90°

static void demo4(void) 
{
  NRF_LOG_INFO("Demo 4/逆时针旋转90°");
  uint16_t i,j;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 128; i++) {
      for (j = 7; j > 0; j--) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(1);
      }
    }
    NRF_P0->OUT = 0x00;
    nrf_delay_ms(500);
    if(++count == 5)
    {
      break;
    }
  }
}

4.5 逆时针旋转180度

static void demo5(void) 
{  
  NRF_LOG_INFO("Demo 5/逆时针旋转 180度");
  uint16_t i,j;
  NRF_P0->OUT = 0x00;
  count=0;
  while (1) {
    for (i = 0; i < 256; i++) {
      for (j = 7; j > 0; j--) {//输出一个脉冲
        NRF_P0->OUT = control_IO[j];
        nrf_delay_ms(1);
      }
    }
    NRF_P0->OUT = 0x00;
    nrf_delay_ms(500);
    if(++count == 5)
    {
      break;
    }
  }
}
旋转角度A与脉冲数B的关系

A = (5.625°/64)*B

若A等于360°,那么需要4096个脉冲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值