自动增益控制放大器
// CCR0 = 32768 - 1; //设置定时器A的中断时间为1S //TACTL = TASSEL_1 + MC_1; //计数时钟ACLK, 增计数模式 // CCTL0 |= CCIE;
_EINT(); //开启总中断 // _BIS_SR(LPM0_bits+GIE); //低功耗模式 LPM0 DACreset();
while (1) {
if(keyin!=0x0f) {
//delay(); switch(keyin) { case 0x0e:
bz_v+=248;break; //P1.0键按下,标准电压步进加0.2v case 0x0d:
bz_v-=248;break; //P1.1键按下,标准电压步进减0.2v case 0x0b:
t+=1;if(t==2) t=0;break; //选择是否开启噪声监测 default:break; }
while(keyin!=0x0f);
if(bz_v>=3724) //上限为3v bz_v=3724;
else if(bz_v<=1241) //下限为1v bz_v=1241; }
DACout(); } }
/******************************************* 函数名称:ADC12ISR
功 能:ADC中断服务函数,在这里用多次平均的 计算P6.0和P6.1口的模拟电压数值 参 数:无
25
成都工业学院毕业设计(论文)
返回值 :无
********************************************/ #pragma vector=ADC_VECTOR __interrupt void ADC12ISR (void) {
static uint index = 0;
results[index++] = ADC12MEM0; // 采样输出电压 if(index == Num_of_Results) {
uchar i;
//unsigned long sum0 = 0;
index = 0;
for(i = 0; i < Num_of_Results; i++) {
sum0 += results[i]; }
sum0 >>= 5; //除以32 Trans_val(sum0); //显示输出电压值 if(t==0) //没有按键按下时 {
if( sum0>bz_v) //判断采样值是否大于标准值 { z+=50; //如果大于,则增大DA输出,减小反馈增益 if(z>=3276) //输出2v时,衰减倍数最大 z=3276; }
else if(sum0 z=0; //输出为0v时,放大倍数最大,3倍 } bzxs(bz_v); //显示标准值 } else if(t==1) //如果有键按下 { 26 自动增益控制放大器 if(sum0>micbz_v) //如果麦克风输入小于反馈值 z+=100; //衰减输出信号 if(sum0 static uint index1 = 0; results1[index1++] = ADC12MEM1; if(index1 == Num_of_Results) { uchar i1; unsigned long sum1 = 0; index1 = 0; for(i1 = 0; i1 < Num_of_Results; i1++) { sum1 += results1[i1]; } sum1>>= 5; micbz_v=1241+sum1; if(micbz_v>3723) micbz_v=3723; if(micbz_v<1241) micbz_v=1241; //Trans_val1(sum1); } static uint index2 = 0; results2[index2++] = ADC12MEM2; if(index2 == Num_of_Results) { uchar i2; unsigned long sum2 = 0; index2 = 0; // 麦克风采样数据控制标准值 //除以32 //麦克风输入的电压,固定增加1v //显示麦克风采集的电压 // 采样数据控制模拟开关 27 成都工业学院毕业设计(论文) for(i2 = 0; i2 < Num_of_Results; i2++) { sum2 += results2[i2]; } sum2>>= 5; //除以32 Trans_val2(sum2); //显示输入信号幅度 if(sum2<13) //当输入电压大于100mv时, P3OUT=BIT0; //打开衰减信号通道 else if(sum2>=13&&sum2<125) P3OUT=BIT1; //打开未衰减信号(P3.1)通道 else if(sum2>=125) P3OUT=BIT2; //打开未衰减信号(P3.2)通道 } } /******************************************* 函数名称:Trans_val 功 能:将16进制ADC转换数据变换成4位10进制 真实的模拟电压数据,并在液晶上显示 参 数:Hex_Val--16进制数据 n--变换时的分母等于2的n次方 返回值 :无 ********************************************/ void Trans_val(uint Hex_Val) //电压测量 { unsigned long caltmp; unsigned long daa; uchar i; uchar ptr[5]; caltmp = Hex_Val; daa=((caltmp/1)*805664)/1000000; //参考电压为3.3v时,转化为十进制 // daa=((caltmp/1)*610351)/1000000; //参考电压为2.5v时 ptr[0] = daa / 1000; //取参数的权位值 ptr[1] = 10; 28 自动增益控制放大器 ptr[2] = (daa - ptr[0]*1000)/100; ptr[3] = (daa - ptr[0]*1000-ptr[2]*100)/10; ptr[4]=daa; //shuzi表中第10位对应符号\ for(i = 0;i < 5;i++) Disp1Char((1 + i),0,shuzi[ptr[i]]); } void Trans_val1(uint Hex_Val) //输入信号幅度测量,更改运算参数 { unsigned long caltmp; unsigned long daa; uchar i; uchar ptr[5]; caltmp = Hex_Val; daa=((caltmp/1)*805664)/1000000; ptr[0] = daa / 1000; //Hex->Dec变换 ptr[1] = 10; ptr[2] = (daa - ptr[0]*1000)/100; ptr[3] = (daa - ptr[0]*1000-ptr[2]*100)/10; ptr[4]=daa; //shuzi表中第10位对应符号\ for(i = 0;i < 5;i++) Disp1Char((1 + i),1,shuzi[ptr[i]]); } void Trans_val2(uint Hex_Val) //输入信号频率测量,更改运算参数 { unsigned long caltmp; unsigned long daa; uchar i; uchar ptr[5]; caltmp = Hex_Val; daa=((caltmp/1)*805664)/1000000; ptr[0] = daa / 1000; //Hex->Dec变换 ptr[1] = (daa - ptr[0]*1000)/100; ptr[2] = 10; //shuzi表中第10位对应符号\ ptr[3] = (daa - ptr[0]*1000-ptr[1]*100)/10; 29