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个脉冲