ADC(Analog to Digital Converter)是模拟转数字采样器。Arduino的ADC口只能测量直流电,即0.0v ~ REFv(REF ≥ 0.0),但有时我们需要测量-REFv ~ +REFv的交流电,如音频信号,那就变得尴尬了~= ̄ω ̄=
让交流音频信号可被Arduino测量:
在Arduino中对畸变的信号还原:
如下图所示:
共射极放大电路可以为信号添加一个固定的直流偏置电压,使信号完全偏移到正电压上,另外它也可以放大信号的电压,满足Arduino ADC接口的测量标准。
上面的电路为固定偏置共射极放大电路。我们计算的共射极放大电路中使用到的三极管是NPN型三极管,它有三个极:
三极管有两种半导体类型:
三极管的放大倍数:
我们一般计算一个放大电路的参数,会把里面的电流都控制到一个静态的点上去计算,这样可以避开复杂的电流变化带来的计算上的麻烦。而我们输入端有个阻隔直流的电容C,所以信号静止不变时,能够输入放大电路的电压就为0v了,这就引入了静态工作点的参数估算,习惯上也把它称作Q点。
因为输入放大电路的电压为0v,所以这个时候在三极管基极 b (阀门端)上输入的电压就只有电阻R b 上的电压V b 了,此时我们就知道了流入三极管基极 b (阀门端)的电流I b
进而由三极管VT放大后输出的电流I c 为
所以三极管VT输出的电压V ce 为
一般情况下,V cc 和VT的放大倍数β都已经事先确定,所以接下来要确认的是分压电阻R c 和偏置电阻R b 。
电源电流通过偏置电阻R b 流入三极管VT基极 b (阀门端)的电流是 I b = Vcc / R b ,在三极管VT的集电极 c 和发射极 e 之间就会产生一个 β * I b *倍的电流,经过电阻R e 的转换,在电阻R e 两端就会得到一个电压V e ,这就是偏置电压。
偏置电压负责处于正负半周上的信号提高到正半周,使信号在任何时候都不会有电压为负的情况出现。
所以我们调整偏置电阻R b 的目的也就明了了,我们要调整一个足够的偏置电压,使得信号在任何时候都不会有负电压,但也不能调整得太大,使信号的最高电压超过三极管VT的放大极限,出现 饱和 的情况(因为饱和部分其实会被“削顶”,而不是像下面的示意图一样好好活着~)
因为三极管VT的放大系数β会随着温度的升高而升高,即通过集电极 c 与发射极 e 之间的电流I ce 会增加,从而流向基极 b 的电流I b 会减少,这就造成偏置电压降低。
这会让偏置并放大后的音频信号上下浮动,而且可能造成"削顶"失真。
要解决这个问题,我们需要改良放大电路,为分压式偏置共射极放大电路,如下图。
我们添加了电阻R b2 和电阻R e 来平衡偏置电压。
偏置电阻R b1 和R b2 把电源电压V cc 按电阻比例稳定的分为两部分,输入三极管VT基极 b (阀门端)的电压V b 也由偏置电阻R b1 和R b2 的分压值决定,所以V b 是稳定的。
此时,如果三极管VT温度上升,通过集电极 c 与发射极 e 之间的电流I ce 会增加,那么电阻R e 的电压V e 也会上升,三极管VT的基极 b 和发射极 e 之间的压降就下降了,所以流入三极管基极 b 的电流I b 也降低了,从而降低了偏置电压,使偏置电压处于稳定状态。
三极管VT的基极 b 的电压V b 为
三极管VT的发射极 b 的电流I e 为
三极管VT的集电极 c 与发射极 e 之间压降V ce 为
[未完,但要不要待续咧~←_←]
运放输入阻抗高,输出阻抗低,放大倍数高,做ADC的信号匹配再合适不过了~
如果使用运放来适配ADC采集交流电信号,做到如下两级就通常就足够了:
加法器 → 反向放大器
有以下疑问:1. SoftPWMSet 这是什么鬼? arduino的pwm输出,可以直接使用analogwrite函数。若是你自己写的,;源文件丢出来给人看看是啥。
2. 还有"pins_arduino.h"也是,如果是自己写的,都把它贴出来。
3. arduino的中断,不是这样用的。直接使用<avr/interrupt.h>,会造成冲突.
4. 对你这个程序,你遇到的困难是?想跟网友求助那个问题?看了10多分钟,还是一头雾水。你这个我大概看了下,目测你的程序是这样的:3,5,10,9,这四个引脚来控制两个直流电机,直接扩流来驱动电机,引脚8接的是一个LeD,用于显示状态,还有个11引脚,从注释的字面上理解,应该是超声波的相关引脚,但是一个引脚,超声波,我愚钝,看不出来的是干嘛。
看了10多分钟,还没搞懂你想要干嘛,根据超声波测得的距离,来控制小车前进后退?还是前进过程中,超声波检测到障碍来做避障?
根据前面的分析,你这段代码,肯定是不通过编译的,错误提示呢?
你要网友帮你修正程序,但是又不知道你的需求,怎么改?
总之,分给我吧~~~
//任务:通过按钮控制电机启停和正反转,通过电位计调节电机转速。int K1=5 //把K1(正转)按钮连在数字端口5
int K2=6 //把K2(反转)按钮连在数字端口6
int K3=7 //把K3(停止)按钮连在数字端口7
int potpin = 3// 把电位计连在模拟端口3
int A=2 //数字端口2、3控制电机启停和转向
int B=3
int PWMpin = 9// 数字端口9输出PWM信号,控制电机转速
//初始化
void setup()
{
pinMode(K1,INPUT)//把数字端口5、6、7设置输入模式
pinMode(K2,INPUT)
pinMode(K2,INPUT)
pinMode(A,OUTPUT)//把数字端口2、3设置输入模式
pinMode(B,OUTPUT)
}
//主程序
void loop()
{
//如果按下K1(正转)按钮
if(digitalRead(K1)==LOW)
{
//电机正转
digitalWrite(A,HIGH)
digitalWrite(B,LOW)
}
//如果按下K2(反转)按钮
if(digitalRead(K2)==LOW)
{
//电机反转
digitalWrite(A,LOW)
digitalWrite(B,HIGH)
}
//如果按下K3(停止)按钮
if(digitalRead(K3)==LOW)
{
//电机停止
digitalWrite(A,LOW)
digitalWrite(B,LOW)
}
int sensorValue = analogRead(potpin)//读取电位计采样值
sensorValue = sensorValue/4// 采样值 0-1024 转换为 0-255
analogWrite(PWMpin, sensorValue)//把处理后的转换值以PWM信号形式输出
delay(20)//延时
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)