首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用msp430与TLC5620实现AD_DA

用msp430与TLC5620实现AD_DA

刚刚弄了一个AD_DA的转换。拿来和大家分享一下。这个东西没有太多的使用价值,只是初学者的练手而已。   先说一下器件吧,话筒一个,LM324N放大器将一个,TDA2822音频放大器一个,扬声器一个(不要太大,耳麦上就可以),TLC5620msp430学习板,电容、电阻自不用说。
     框架图如下:
     话筒——》LM324N——》msp430(ADC12)——》tlc5620——》TDA2822——》扬声器(输出)
  lM324N的电路图如下(由于没用PCB绘图,画的很难看,还请见谅)


  关于TDA2822呢参照手册上的带你路途即可,这里不再画出。
下面是程序代码部分:
//================================================
//define.h文件
#define SIMO BIT1
#define SOMI BIT2
#define SCLK BIT3
#define LDAC BIT7
#define LOAD BIT6
//==============================================
//================================================
//Init_ADDA.c文件
//==========================================================
//功能:AD模块初始化
//描述://
//代码:
void Init_AD()
{
//初始化AD
P6SEL = 0xC0;
ADC12CTL0 = ADC12ON+REFON+REF2_5V+SHT0_8;           // Turn on ADC12, extend sampling time
ADC12CTL1 = SHP+ADC12SSEL_2+CONSEQ_0;                 // Use sampling timer, repeated sequence
ADC12MCTL0 = SREF_1+INCH_6;

ADC12CTL0 |= ENC;
}
//================================================================
//================================================================
//功能:DA模块初始化
//描述:本DA模块是外接的(利用SPI进行通信)
//代码:
void Init_Spi()
{  //初始化SPI
        U0CTL |=SWRST;
        P3SEL=0;
        P3SEL |= SIMO |SCLK | SOMI;
        ME1 |=USPIE0;//SPIO allow
        U0CTL=0X00;//reset register is '0'
        U0CTL |=CHAR + SYNC + MM+SWRST;//data 8 bit,SPI,master
        U0TCTL=0X00;//reset register is '0'
        U0TCTL=SSEL1+SSEL0+STC;//timer is smclk,3 line
        //bit offset
        UBR00=0X20;
        UBR10=0x00;
        UMCTL0=0X00;
        U0CTL &=~SWRST;
        IE1 &=~UTXIE0;//发送中断允许
        IE1 &=~URXIE0;
         
        
      }
//=============================================================
//=============================================================
//功能:时钟模块初始化
//描述://
//代码:
void Init_Clk()
     {
            int i;
            do
            {
                    BCSCTL1 &= ~XT2OFF;  // turn on XT2
                    IFG1 &= ~OFIFG;  // high frequency crystal is stable
                    for (i=0; i < 2000; i++)
                    { }
            }while ((IFG1 & OFIFG) !=0);
   
            // MClk = 6M / 1 = 6M ;
            // SMClk = 6M / 1 = 6M
            BCSCTL2 |= SELM_2 + DIVM_0 + SELS;
     }
//====================================================================
//===================================================================
//功能:I/O口初始化
//描述://
//代码:
void Init_Port()//P3脚设置
{
   P3DIR=0;
  
   P3DIR |=LOAD + LDAC;
   P3OUT |=LOAD + LDAC;
   
}
//================================================================
//=================================================
//功能:I/O口高电平输出函数
//描述://
//代码:
void Init_high(int a)
{
  P3OUT |=a;
}
//======================================================

//=====================================================
//功能:I/O口低电平输出函数
//描述://
//代码:
void Init_low(int b)
{
   P3OUT &=~b;
// _NOP();
}
//===========================================

//=================================================
//功能:延时函数
//描述://
//代码:
void delays()
{
  unsigned short i;
  for(i=0;i<5;i++) {_NOP();}
}
//=====================================================

//===================================================
//功能:data输出函数
//代码:
void Init_tx(unsigned long  data,unsigned int xuan)
{  while((IFG1 & UTXIFG0)!=UTXIFG0);
  TXBUF0=xuan;
   while((IFG1 & UTXIFG0)!=UTXIFG0);
TXBUF0=data;
  Init_low(LOAD);
  _NOP();
  Init_high(LOAD);
   _NOP();
   Init_low(LDAC);
   _NOP();
   Init_high(LDAC);
   
  
}
//====================================================

//====================================================
//main.c文件
#include "io430.h"
#include "in430.h"
#include "define.h"
#include "Init_ADDA.c"
//======================================
//功能:中间数据,用于将AD存储器中数据赋给SPI
unsigned long Gv_data;
//=============================================
//================================================
//功能:主函数
//描述://
//代码:
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
   Init_Clk();
   Init_Port();
   Init_Spi();
   Init_AD();
   
   while(1)
   {
      //使用软件启动AD转换,必须在转换之前,先复位Enc,然后再使能ENC
            ADC12CTL0 &= ~ENC;                         // Enable conversions
            ADC12CTL0 |= (ENC|ADC12SC);
            while(ADC12CTL1 & ADC12BUSY)
            {}
            Gv_data = ADC12MEM0;
            Gv_data=Gv_data>>4;
            Init_tx(Gv_data,0);
            
            
            
   }
  //return 0;
}
关于程序的一点说明:由于msp430f135的AD是12位的而TLC5620是8位所以对于AD采到的数据要取高8位,固出现了Gv_data>>4的情况,还有一点是二者的采样速率要一者,体现在时钟上。
还有一点是关于硬件的由于TLC5620只有8位,固只能体现一个声道,只用到TAD2822的一个输出。
返回列表