電賽總結(二)——AD芯片總結之音頻處理芯片ADC8009


一、特性參數

1、專門用來用音頻處理的AD芯片

2、內部固定好8K的采樣速率

3、8位AD芯片

 

二、內部結構圖

image

 

三、芯片管腳圖

image

 

四、管腳功能說明

管腳名稱 功能
IN0~IN7 數據輸入端
ABC 數據輸入端口選擇
image
ST

ST 為轉換啟動信號。當ST 上跳沿時,所有內部寄存器清零;下跳沿時,開始進行A/D 轉換;在轉換期間,ST 應保持低電平。

EOC

EOC 為轉換結束信號。當EOC 為高電平時,表明轉換結束;否則,表明正在進行A/D 轉換

OE

OE為輸出允許信號,用於控制三條輸出鎖存器向單片機輸出轉換得到的數據。OE=1,輸出轉換得到的數據;OE=0,輸出數據線呈高阻狀態。D7-D0 為數字量輸出線。

D7-D0 數字量輸出線
CLK

時鍾輸入信號線。因ADC0809的內部沒有時鍾電路,所需時鍾信號必須由外界提供,通常使用頻率為500KHZ

VREF(+) 參考電壓輸入正極
VREF(-) 參考電壓輸入負極

 

五、STM32F103ZE驅動程序

#include "stm32f10x.h"



#define CLK GPIO_Pin_0
//#define B     GPIO_Pin_1
//#define C        GPIO_Pin_2
#define ALE GPIO_Pin_4
//#define IN0 GPIO_Pin_4
#define ST    GPIO_Pin_5
#define OE    GPIO_Pin_6
//#define A     GPIO_Pin_7


#define D0     GPIO_Pin_0
#define D1     GPIO_Pin_1
#define D2     GPIO_Pin_2
#define D3     GPIO_Pin_3
#define D4    GPIO_Pin_4
#define D5     GPIO_Pin_5
#define D6     GPIO_Pin_6
#define D7     GPIO_Pin_7
#define EOC GPIO_Pin_8

double val=0;

void delay(u32 kk)
{
  while(kk--);
}


/*
const unsigned short CLK= GPIO_Pin_0;
const unsigned short B=GPIO_Pin_1;
const unsigned short C=GPIO_Pin_2;
const unsigned short ALE=GPIO_Pin_3;
const unsigned short IN0=GPIO_Pin_4;
const unsigned short ST=GPIO_Pin_5;
const unsigned short OE=GPIO_Pin_6;
const unsigned short A=GPIO_Pin_7;


const unsigned short D0=GPIO_Pin_0;
const unsigned short D1=GPIO_Pin_1;
const unsigned short D2=GPIO_Pin_2;
const unsigned short D3=GPIO_Pin_3;
const unsigned short D4=GPIO_Pin_4;
const unsigned short D5=GPIO_Pin_5;
const unsigned short D6=GPIO_Pin_6;
const unsigned short D7=GPIO_Pin_7;
const unsigned short EOC=GPIO_Pin_8;
*/

void ad_init()
{
    
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    
    GPIO_ResetBits(GPIOA, ALE);
//    GPIO_ResetBits(GPIOA, A);
//    GPIO_ResetBits(GPIOA, B);
//    GPIO_ResetBits(GPIOA, C);
     //delay(10);

    GPIO_SetBits(GPIOA, ALE); 
    //CLK
}


void adc0809_input()
{
    //ST²úÉúÉÏÉýÑØºÍϽµÑØ
    GPIO_ResetBits(GPIOA, ST);
    delay(10);
    GPIO_SetBits(GPIOA,ST);
    delay(10);
    GPIO_ResetBits(GPIOA, ST);
    delay(10);
    while(GPIO_ReadInputDataBit(GPIOB, EOC)==0);
    
    GPIO_SetBits(GPIOA,OE);
    val=GPIO_ReadInputDataBit(GPIOB, D0)*0x0001+
         GPIO_ReadInputDataBit(GPIOB, D1)*0x0002+
       GPIO_ReadInputDataBit(GPIOB, D2)*0x0004+
       GPIO_ReadInputDataBit(GPIOB, D3)*0x0008+
       GPIO_ReadInputDataBit(GPIOB, D4)*0x0010+
       GPIO_ReadInputDataBit(GPIOB, D5)*0x0020+
       GPIO_ReadInputDataBit(GPIOB, D6)*0x0040+
       GPIO_ReadInputDataBit(GPIOB, D7)*0x0080;
    
    GPIO_ResetBits(GPIOA,OE);
    
    //val=val*2*0.98;
}



void timer_init()         //¶¨Ê±Æ÷ÖжÏÅäÖÃ
{
        
    NVIC_InitTypeDef NVIC_InitStructure;      //ÅäÖÃÖжϽṹ
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
       
    
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                     //ÅäÖÃÄÚ²¿Ê±ÖÓ
    NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);//¶¨Ê±Æ÷3µÄÖжϳõʼ»¯
    
      TIM_TimeBaseStructure.TIM_Period=100;      //ÓëÏÂÒ»ÐÐÓï¾äÅäºÏ£¬µ¥Æ¬»úʱÖÓÐźÅĬÈÏÇé¿öÏÂÊÇ72MHz£¬¸Ä10000Õâ¸öÊý¿ÉÒÔÉèÖÃÖжÏʱ¼ä
    TIM_TimeBaseStructure.TIM_Prescaler=72;    //ÕâÐÐÒ²¿ÉÒԸ쬵«ÊÇΪÁËÊý¾Ý·ÖÅäÇå³þ£¬»¹ÊÇÉÏÒ»ÐÐÕû°ÙÕû°ÙµØ¸Ä±È½ÏºÃ
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
    TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE);
    TIM_Cmd(TIM3, ENABLE);    
}

int i=1;
void TIM3_IRQHandler()
{
  if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //È·¶¨½øÈëÁËÕâ¸öÖжÏ
  {
    TIM_ClearITPendingBit(TIM3, TIM_IT_Update);            //    Çå³ý±êÖ¾£¬±£ÏÕÆð¼ûÒª¼Ó
    adc0809_input();
        if(i==1)
        {
            GPIO_SetBits(GPIOA, GPIO_Pin_8);
        i=0;
        }
        
        else
        {
            i=1;
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
        }
  }
}

void ADC0809_Clock()
{
   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   TIM_OCInitTypeDef TIM_OCInitStructure;
     GPIO_InitTypeDef GPIO_InitStructure;
    

    
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
    
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);
    

      //PWM--->100Hz
  TIM_TimeBaseStructure.TIM_Period=10;      
  TIM_TimeBaseStructure.TIM_Prescaler=12;
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 
//  //PA6--->50%                                             //?????
  TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;   
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;     
  TIM_OCInitStructure.TIM_Pulse=5;                    //pulse????period??????
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;   
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    //  //PA7--->40%       
//  TIM_OCInitStructure.TIM_Pulse=40;    
//  TIM_OC2Init(TIM3, &TIM_OCInitStructure);
//  //PB0--->60%         
//  TIM_OCInitStructure.TIM_Pulse=60;     
//  TIM_OC3Init(TIM3, &TIM_OCInitStructure);
//  //PB1--->80%           
//  TIM_OCInitStructure.TIM_Pulse=80;    
//  TIM_OC4Init(TIM3, &TIM_OCInitStructure);
    
     TIM_Cmd(TIM2, ENABLE);
}



int main()
{      
      
      ad_init();
      GPIO_SetBits(GPIOA, GPIO_Pin_3); 
    ADC0809_Clock(); 
      timer_init();   
      
      
    while(1)
        {
        
        }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM