STM8S AD轉換

//不說那麼多了,直接上程序
void ADC1_DeInit(void)
{
    ADC1->CSR  = ADC1_CSR_RESET_VALUE;
    ADC1->CR1  = ADC1_CR1_RESET_VALUE;
    ADC1->CR2  = ADC1_CR2_RESET_VALUE;
    ADC1->CR3  = ADC1_CR3_RESET_VALUE;
    ADC1->TDRH = ADC1_TDRH_RESET_VALUE;
    ADC1->TDRL = ADC1_TDRL_RESET_VALUE;
    ADC1->HTRH = ADC1_HTRH_RESET_VALUE;
    ADC1->HTRL = ADC1_HTRL_RESET_VALUE;
    ADC1->LTRH = ADC1_LTRH_RESET_VALUE;
    ADC1->LTRL = ADC1_LTRL_RESET_VALUE;
    ADC1->AWCRH = ADC1_AWCRH_RESET_VALUE;
    ADC1->AWCRL = ADC1_AWCRL_RESET_VALUE;
}

void ADC1_Init(ADC1_ConvMode_TypeDef ADC1_ConversionMode, 
               ADC1_Channel_TypeDef ADC1_Channel,\
               ADC1_PresSel_TypeDef ADC1_PrescalerSelection,\
               ADC1_ExtTrig_TypeDef ADC1_ExtTrigger,\
               FunctionalState ADC1_ExtTriggerState,\
               ADC1_Align_TypeDef ADC1_Align,\
               ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel,\
               FunctionalState ADC1_SchmittTriggerState)
{

    /* Check the parameters */
    assert_param(IS_ADC1_CONVERSIONMODE_OK(ADC1_ConversionMode));//單次還

是連續轉換
    assert_param(IS_ADC1_CHANNEL_OK(ADC1_Channel));
    assert_param(IS_ADC1_PRESSEL_OK(ADC1_PrescalerSelection));
    assert_param(IS_ADC1_EXTTRIG_OK(ADC1_ExtTrigger));
    assert_param(IS_FUNCTIONALSTATE_OK(((ADC1_ExtTriggerState))));
    assert_param(IS_ADC1_ALIGN_OK(ADC1_Align));
    assert_param(IS_ADC1_SCHMITTTRIG_OK(ADC1_SchmittTriggerChannel));
    assert_param(IS_FUNCTIONALSTATE_OK(ADC1_SchmittTriggerState));

    /*-----------------CR1 & CSR configuration --------------------*/
    /* Configure the conversion mode and the channel to convert
    respectively according to ADC1_ConversionMode & ADC1_Channel values  

&  ADC1_Align values */
    ADC1_ConversionConfig(ADC1_ConversionMode, ADC1_Channel, ADC1_Align);
    /* Select the prescaler division factor according to 

ADC1_PrescalerSelection values */
    ADC1_PrescalerConfig(ADC1_PrescalerSelection);

    /*-----------------CR2 configuration --------------------*/
    /* Configure the external trigger state and event respectively
    according to NewState, ADC1_ExtTrigger */
    ADC1_ExternalTriggerConfig(ADC1_ExtTrigger, ADC1_ExtTriggerState);

    /*------------------TDR configuration ---------------------------*/
    /* Configure the schmitt trigger channel and state respectively
    according to ADC1_SchmittTriggerChannel & ADC1_SchmittTriggerNewState 

 values */
    ADC1_SchmittTriggerConfig(ADC1_SchmittTriggerChannel, 

ADC1_SchmittTriggerState);

    /* Enable the ADC1 peripheral */
    ADC1->CR1 |= ADC1_CR1_ADON;

}

void ADC1_Cmd(FunctionalState NewState)
{

    /* Check the parameters */
    assert_param(IS_FUNCTIONALSTATE_OK(NewState));

    if (NewState != DISABLE)
    {
        ADC1->CR1 |= ADC1_CR1_ADON;
    }
    else /* NewState == DISABLE */
    {
        ADC1->CR1 &= (u8)(~ADC1_CR1_ADON);
    }

}

void ADC1_StartConversion(void)
{
    ADC1->CR1 |= ADC1_CR1_ADON;
}

FlagStatus ADC1_GetFlagStatus(ADC1_Flag_TypeDef Flag)
{
    u8 flagstatus = 0;
    u8 temp = 0;

    /* Check the parameters */
    assert_param(IS_ADC1_FLAG_OK(Flag));
  
    if ((Flag & 0x0F) == 0x01)
    {
        /* Get OVR flag status */
        flagstatus = (u8)(ADC1->CR3 & ADC1_CR3_OVR);
    }
    else if ((Flag & 0xF0) == 0x10)
    {
        /* Get analog watchdog channel status */
        temp = (u8)(Flag & 0x0F);
        if (temp < 8)
        {
            flagstatus = (u8)(ADC1->AWSRL & (1 << temp));
        }
        else
        {
            flagstatus = (u8)(ADC1->AWSRH & (1 << (temp - 8)));
        }
    }
    else  /* Get EOC | AWD flag status */
    {
        flagstatus = (u8)(ADC1->CSR & Flag);
    }
    return ((FlagStatus)flagstatus);

}

u16 ADC1_GetConversionValue(void)
{

    u16 temph = 0;
    u8 templ = 0;

    if (ADC1->CR2 & ADC1_CR2_ALIGN) /* Right alignment */
    {
        /* Read LSB first */
        templ = ADC1->DRL;
        /* Then read MSB */
        temph = ADC1->DRH;

        temph = (u16)(templ | (u16)(temph << (u8)8));
    }
    else /* Left alignment */
    {
        /* Read MSB firts*/
        temph = ADC1->DRH;
        /* Then read LSB */
        templ = ADC1->DRL;

        temph = (u16)((u16)(templ << (u8)6) | (u16)(temph << (u8)8));
    }

    return ((u16)temph);

}

//以下程序是用AN3即PB3進行AD轉換,並將AD值放在 u16 ADVal

//初始化時調用:
   GPIO_DeInit(GPIOB);
  GPIO_Init(GPIOB, GPIO_PIN_3, GPIO_MODE_IN_FL_NO_IT);//設置IO爲懸浮輸入

  ADC1_DeInit();
  ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,ADC1_CHANNEL_3,\
            ADC1_PRESSEL_FCPU_D6,ADC1_EXTTRIG_TIM,DISABLE,\
            ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_CHANNEL3,DISABLE);
    /*單次轉換*/ /*PB3/AN3*/ /*6分頻*/  /*內部定時器1 TRG事件*/  
  /*禁止外部觸發轉換*/ /*數據右對齊  (低8字節在ADC_DRL寄存器,其餘高字節

位在ADC_DRH寄存器)讀順序
應先讀低位,再讀高位字節*/
  ADC1_Cmd(ENABLE);//允許進行AD轉換


//進行AD取值時調用:

      ADC1_StartConversion();//開始AD轉換
      while(0==ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待轉換完成      
      ADC1_ClearFlag(ADC1_FLAG_EOC);  //清除AD完成標誌位
      ADVal = ADC1_GetConversionValue();//讀AD值


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章