yanniwang

利用ADuC7026单片机及阻容电路产生高频正弦波

0
阅读(35678)

    正弦波信号时工业测量中常用的激励信号,产生正弦波信号的方法有很多,比较经济的方法是采用文氏桥震荡电路,但是RC振荡电路对温度变化较敏感,在工业现场难以保证温度恒定,这给测量精度带来很大误差。用单片机上的DAC产生正弦波信号是不错的选择,对于温度变化不敏感,能达到较好的要求,当然,目前也有专用正弦波发生芯片,但这类芯片价格仍比较高,所以如果系统中使用了单片机,不妨用单片机做一个信号发生器~

    单片机能产生正弦波也是有限的,对于低频信号较容易,但对于高频信号就要进行信号调理,本文要设计一个频率为40KHz的正弦波,对于幅度没有具体要求,因为后面可以接运放进行放大,但要求稳定。对于一般的单片机来说,这个频率算是很高的了,有的甚至达不到高频要求,下面看看ADI公司的ADuC7026的DAC能否做出这样的正弦波。

   根据上面要求,我做了几次试验,尽量简化算法,以提高频率,但是要想波形好看,还是只能保证在20Khz,最后不得已只好采用滤波的方法了,看一下DAC直接输出的波形如下:

 

看起来不像正弦吗?好吧,那就滤波看看~

滤波后的波形如下图:

 


    因为测量中的激励要求为交流信号,还需要一个隔直电路如下图所示,是隔直后的交流正弦信号。还有一些毛刺,不过在放大环节中再处理下就可以了。

 

附:ADUC7026源程序

/*利用定时器中断定时,对DAC数据寄存器更新,达到输出阶梯式正弦波的目的*/

 #include <ADuC7026.h>

#include <stdio.h>
 
/**********全局变量声明**************/
int   m = 0;
const static unsigned int TableS[8] = {
  0x07FF0000, 
  0x0DA70000,  
  0x0FFF0000, 
  0x0DA70000, 
  0x07FF0000, 
  0x02570000, 
  0x00000000, 
  0x02570000
}; 

 /********中断服务*******/

void IRQ_Handler() __irq
{
   
DAC0DAT = TableS[m] ;  
m++;
m &= 0x07; 
T1CLRI = 0x01;

 int main (void)  {

 
 
POWKEY1 = 0x01;
POWCON = 0x00;
POWKEY2 = 0xF4;
 
// DAC configuration
DAC0CON = 0x12; // DAC 配置
 
 
REFCON = 0x01; // 参考内部2.5伏基准
 
DAC0DAT = 0x08000000; // 从正弦波中间值开始
 
T1LD = 0x80; // 定时器初始化--Counter Value ,0x90=36khz,0x80=40khz;
T1CON = 0xC0; // Enabled,Periodic,Binary and CLK/16
IRQEN = GP_TIMER_BIT; // 使能定时器中断
 
// GP4DAT = 0x04000000; // 指示灯亮
 
  while(1)
  { }                        //循环
 
}