关于STM8S ADC1单次扫描转换的问题
问题点:单次扫描转换,转换不成功。现象:小弟设置ADC1为单次扫描转换,BUFFER使能,使能EOC中断,实际外接通道为AIN0和AIN1(均为DC 5v),结果发现进入EOC中断后数据缓冲寄存器ADC_DBxR 中只有CHANNEL0的BUFFER中有转换的数据,CHANNEL0的BUFFER数据一直为0.
源代码:
/* Configure PB0,PB1 for ADC1 */
GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT); // Ain0
GPIO_Init(GPIOB, GPIO_PIN_1, GPIO_MODE_IN_FL_NO_IT); // Ain1
void Init_ADC1(void)
{
/* Initialize ADC1 in RESET value */
ADC1_DeInit();
/* Debug ADC1 scan mode */
ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_0, ADC1_ALIGN_RIGHT);
//Configure the single conversion mode and the channel 0 to convert
//Configure ADC1 conversion value right align
ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL0, DISABLE);
//Disable the schmitt trigger channel0
ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_1, ADC1_ALIGN_RIGHT);
//Configure the single conversion mode and the channel 1 to convert
//Configure ADC1 conversion value right align
ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL1, DISABLE);
//Disable the schmitt trigger channel1
ADC1_ScanModeCmd(ENABLE); //Enable scan mode
ADC1_DataBufferCmd(ENABLE); //Enable the ADC1 data store into the Data Buffer registers
ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE); //Enable EOC interrupt
}
/* start up converting every 500ms */
ADC1_Cmd(ENABLE); //Wake up ADC1
Delay(2);
ADC1_Cmd(ENABLE); //Start up conversion
INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
/* Debug code */
if(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == 0x80)
{
ADC1_AIN0_Value = ADC1_GetBufferValue(0);
ADC1_AIN1_Value = ADC1_GetBufferValue(1);
ADC1_AIN2_Value = ADC1_GetBufferValue(2);
ADC1_AIN3_Value = ADC1_GetBufferValue(3);
ADC1_AIN4_Value = ADC1_GetBufferValue(4);
ADC1_AIN5_Value = ADC1_GetBufferValue(5);
ADC1_AIN6_Value = ADC1_GetBufferValue(6);
ADC1_AIN7_Value = ADC1_GetBufferValue(7);
ADC1_AIN8_Value = ADC1_GetBufferValue(8);
ADC1_AIN9_Value = ADC1_GetBufferValue(9);
ADC1_ClearITPendingBit(ADC1_IT_EOC);
ADC1_Cmd(DISABLE); //Close conversion
}
}
调试的结果:ADC1_AIN0_Value 读入值正确,ADC1_AIN1_Value 一直为0(实际应为非0).
注:本人通过单通道轮询转换的方式,转换可行。
由于小弟刚使用STM8,请各位大侠不吝赐教!!
RE:关于STM8S ADC1单次扫描转换的问题
可能的愿意:1、AD的时钟源没有开启。
2、 ADC1_GetBufferValue()代码获取AD值是否是对应AD的?
RE:关于STM8S ADC1单次扫描转换的问题
Sorry,时钟分频漏写了,追加如下:ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);
//Prescaler selection fADC1 = fcpu/2
测试结果为:AIN0转换有效,AIN1一直无转换值(ADC1_AIN1_Value = 0,且ADC_DB1RH = 0和ADC_DB1RL = 0).
RE:关于STM8S ADC1单次扫描转换的问题
按手册的解释应当是对齐的,“对于单次扫描模式,转换是从AIN0通道开始的,而且结果数据被存储在数据缓冲寄存器ADC_DBxR 中,当最后一个通道(通道‘n’)被转换完成后,EOC(转换结束)标志被置位,当EOCIE 位已被置位时将产生一个中断。可以从缓冲寄存器中读取各个通道的转换结果值。”RE:关于STM8S ADC1单次扫描转换的问题
ADC1_GetBufferValue()这个代码如何处理的?RE:关于STM8S ADC1单次扫描转换的问题
该函数为库函数,源码如下:/**
* @briefGet one sample of measured signal.
* @param Buffer specifies the buffer to read.
* @retval BufferValue:value read from the given buffer.
* @par Required preconditions:
* ADC1 conversion finished.
*/
uint16_t ADC1_GetBufferValue(uint8_t Buffer)
{
uint16_t temph = 0;
uint8_t templ = 0;
/* Check the parameters */
assert_param(IS_ADC1_BUFFER_OK(Buffer));
if ((ADC1->CR2 & ADC1_CR2_ALIGN) != 0) /* Right alignment */
{
/* Read LSB first */
templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer
RE:关于STM8S ADC1单次扫描转换的问题
其中,ADC1_BaseAddress 为ADC1寄存器首地址,现在问题的关键是ADC_DB0RH 和 ADC_DB0RL的值读取正常,而ADC_DB0RH 和 ADC_DB0RL的值一直为0,且通过ADC1_CSR观察其转换的最终通道一直为AIN0。所以,我怀疑单次扫描转换时,只转换了AIN0就产生中断,且AIN1一直未进行转换处理。原因为何不清楚?
RE:关于STM8S ADC1单次扫描转换的问题
1、如果是连续采集就要选择连续采集,如果想单次采集,那么采集完一次以后再进行第二次采集的配置。如此循环。RE:关于STM8S ADC1单次扫描转换的问题
求楼主给出完整程序RE:关于STM8S ADC1单次扫描转换的问题
我今天也遇到一样的问题了,后来发现在配置ADC_CSR的通道之前需要先ADON一下激活ADC模块才行,希望对后面人有帮助 是不是激活AD后延时加长一点再读数,才有数据。 连续采样吧,这样得到的数据是实时的。 楼主问题解决了吗,我也遇到这样的问题了。使用查询方式是对的。中断就不行了。 10楼正解!!!
页:
[1]