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;
}
上一篇:用PWM波控制LED灯的闪烁
下一篇:STM8 I2C的学习
推荐阅读最新更新时间:2024-03-16 16:05