STM8 AD的学习


STM8模拟/数字转换器(ADC)


采样的过程一定要满足奈圭斯特采样定理,并一般要经过采样保持、量化和编码3个步骤


。
采样保持电路:
    在A/D转换系统中的作用是保持模拟输入电压不变,以获得正确的数字量结果。
量化:
量化过程中所取最小数量单位成为量化单位。


STM8S105xx系列基础型产品包括一个10位连续渐进式模数转换器(ADC1),提供多达10个多


路复用输入通道。




模拟看门狗
    在单次转换模式和不带缓存的连续模式中模拟看门狗可以通过置位ADC_CSR寄存器的AWDEN位来使能。当模拟电压通过ADC转换后的值低于下限门槛值或者高于上限门槛值时AWD模拟看门狗会被置位。可通过对ADC_HTR和ADC_LTR的10位寄存器编程来设定门槛值,并且通过置位ADC_CSR寄存器的AWDIE位可使能中断。




1、ADC开关控制
通过位置ADC_CR1寄存器的ADON位来开启ADC。当首次置位ADON位时,ADC从低功耗模式唤


醒。
2、ADC时钟
时钟的预分频因子是由ADC_CR1寄存器的SPSEL[2:0]决定的。
3、通道的选择
有多达16个外部输入通道。
4、转换模式
1)单次模式
2)连续和带缓存的连续模式
3)单次扫描模式
4)连续扫描模式


ADC相关的功能寄存器


1、ADC高位数据缓存寄存器(ADC_DBxRH)
    数据的左对齐还是右对齐由ALIGN位决定。
数据的左对齐:这些数据位包含高8位的转换数据。需要在杜低位数据前先读取。
数据的右对齐:这些数据包含(ADC数据宽度减8)的高位转换结果数据。剩下的位为0.


2、ADC低位数据缓存寄存器(ADC_DBxRL)
数据的左对齐还是右对齐由ALIGN位决定。
数据的左对齐:这些数据包含(ADC数据宽度减8)的高位转换结果数据。剩下的位为0.
数据的右对齐:这些数据位包含低8位的转换结果数据。低位字节必须先读,再读高位字


节。


3、ADC控制/状态寄存器(ADC_CSR)
4、ADC配置寄存器1(ADC_CR1)
5、ADC配置寄存器2(ADC_CR2)
6、ADC配置寄存器3(ADC_CR3)
7、ADC数据高位寄存器(ADC_DRH)
8、ADC数据低位寄存器(ADC_DRL)
9、ADC施密特触发器禁止寄存器高位(ADC_TDRH)
10、ADC施密特触发器禁止寄存器低位(ADC_TDRL)
11、ADC上限门槛值高位寄存器(ADC_HTRH)
    模拟看门狗上限电压高位,此位由硬件置位和软件清零。这些位定义了模拟看门狗
上限电压高位值(V refh)的MSB。
12、ADC上限门槛值低位寄存器(ADC_HTRL)
13、ADC下限门槛值高位寄存器(ADC_LTRH)
14、ADC下限门槛值低位寄存器(ADC_LTRL)
15、ADC看门狗状态高位寄存器(ADC_AWSRH)
0:在数据寄存器x中无模拟看门狗事件;
1:数据寄存器x中发生了模拟看门狗事件。






void adc_init(void)
{
    GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT);
    ADC1_DeInit();
    ADC1_Init(ADC1_CONVERSIONMODE_SINGLE,
        ADC1_CHANNEL_4,
        ADC1_PRESSEL_FCPU_D2,
        ADC1_EXTTRIG_TIM,DISABLE,
        ADC1_ALIGN_RIGHT,
        ADC1_SCHMITTTRIG_CHANNEL4,DISABLE);
    ADC1_Cmd(ENABLE);
    ADC1_ClearFlag(ADC1_FLAG_EOC);
    ADC1_StartConversion();
}


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_ClearFlag(ADC1_Flag_TypeDef Flag)
{
    u8 temp = 0;


    /* Check the parameters */
    assert_param(IS_ADC1_FLAG_OK(Flag));


    if ((Flag & 0x0F) == 0x01)
    {
        /* Clear OVR flag status */
        ADC1->CR3 &= (u8) (~ADC1_CR3_OVR);
    }
    else if ((Flag & 0xF0) == 0x10)
    {
        /* Clear analog watchdog channel status */
        temp = (u8) (Flag & 0x0F);
        if (temp < 8)
        {
            ADC1->AWSRL &= (u8) (~((u8) 1 << temp));
        }
        else
        {
            ADC1->AWSRH &= (u8) (~((u8) 1 << (temp - 8)));
        }
    }
    else                        /* Clear EOC | AWD flag status */
    {
        ADC1->CSR &= (u8) (~Flag);
    }
}




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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值