首先,你得先说是转成数字信号还是模拟信号。如果输知入的正弦波电压是从0-5V,在数字电路中,那就是用施密特触发器,你上百度图片输入“施密特触发器”,可以道有很多种实现方式。
如果是正弦波电压从负电压到正电压(即),你就得用运放了,做成“滞回比较器”内的电路,同样你可以在百度图片里输入“滞回比较器”
其实施密特触发器和滞回比较器的传输特性很像,我给你张图吧,这是我自己画的哦,上面有注解,分别是这两个电路
如果想要理解明白,建议再回去看一下数电模电,把数电中的施密特容触发器和模电中的电压比较器看一下
我给你设计了一个电路,如图。
简要说明:首先把24V交流电源整流滤波得到32V左右的带有纹波的直流电压,以此电源作为工作电源,另外用一片开关稳压器LM2576给CD4069(COMS六反相器)提供一路15V的工作电源(因为CD40系列器件不能在高于18V的电源电压下工作),用CD4069中的两个反相器搭成阻容振荡电路(这个电路很容易起振,振荡频率由R和C决定,具体参数要你根据需要的频率去调试一下),再用另一个反相器对前面的正弦振荡电路输出的正弦波进行整形,得到正方波,然后用功率管(晶体管或场效应管均可,图中选择的型号是NPN型功率达林顿复合管)作输出级驱动电机。电机绕组并联的那个1N5820是用来保护输出功率管的。
有什么不明白的可以再沟通。
给你一个电路,刚给你画的,信号整形电路,然后将输出给单片机的T0,用于计数,然后再给你一个数字频率计的程序,AVR的。
#include <iom16v.h> #include <macros.h> #define uchar unsigned char #define uint unsigned int uchar led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; uchar position[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; uchar dis_buff[8]; // 显示缓冲区,存放要显示的8个字符的段码值 uchar posit; uchar time_1ms_ok,display_ok=0; uchar time0_old,time0_new,freq_time; uint freq; void display(void) // 8位LED数码管动态扫描函数 { PORTA = 0xff; PORTC = led_7[dis_buff[posit]]; if (posit==5) PORTC = PORTC | 0x80; PORTA = position[posit]; if (++posit >=8 ) posit = 0; } // Timer 2 output compare interrupt service routine #pragma interrupt_handler timer2_isr:4 void timer2_isr(void) { time0_new = TCNT0; // 1ms到,记录当前T/C0的计数值 time_1ms_ok = 1; display_ok = ~display_ok; if (display_ok) display(); } void freq_to_disbuff(void) // 将频率值转化为BCD码并送入显示缓冲区 { uchar i,j=7; for (i=0;i<=4;i++) { dis_buff[j-i] = freq % 10; freq = freq / 10; } dis_buff[2] = freq; } void main(void) { unsigned char i; DDRA=0xFF; // LED数码管驱动 DDRC=0xFF; // T/C0初始化,外部计数方式 TCCR0=0x06; // 外部T0脚下降沿触发计数,普通模式 TCNT0=0x00; OCR0=0x00; // T/C2初始化 TCCR2=0x0B; // 内部时钟,32分频(4M/32=125KHz),CTC模式 TCNT2=0x00; OCR2=0x7C; // OCR2 = 0x7C(124),(124+1)/125=1ms TIMSK=0x80; // 允许T/C2比较匹配中断 for (i=0;i<=7;i++) dis_buff[i] = 0; time0_old = 0; asm("sei"); // 开放全局中断 while (1) { if (time_1ms_ok) { // 累计T/C0的计数值 if (time0_new >= time0_old) freq = freq + (time0_new - time0_old); else freq = freq + (256 - time0_old + time0_new); time0_old = time0_new; if (++freq_time >= 100) { freq_time = 0; // 100ms到, freq_to_disbuff(); // 将100ms内的脉冲计数值送显示 freq = 0; } time_1ms_ok = 0; } } }。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:3.150秒