STM8S ADC 通道的值互换了,为什么

2019-07-19 21:30发布

最近用STM8S105K4做个项目,要用到ADC的功能,用到的通道是AIN0(PB0)和AIN1.测试的时候发现,AIN0的值变成了AIN1,AIN1的值变成了AIN0了,即两者互换了。请高手指教下,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
ST-FAE-SALE
1楼-- · 2019-07-20 02:16
用DMA的吗?还是连续采集的,可能是采集时间的问题造成的
xuande
2楼-- · 2019-07-20 05:10
从哪里发现的?也许是错觉。

直接看“寄存器”的值,这是根子。
aleelau
3楼-- · 2019-07-20 08:32
 精彩回答 2  元偷偷看……
aleelau
4楼-- · 2019-07-20 09:49

/* 全局变量定义 */
static uint16_t OneChannelGetADValue(ADC1_Channel_TypeDef ADC1_Channel,ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel);
static void Delay(u16 nCount);

/*******************************************************************************
 * 名称: ADC_Init
 * 功能: adc2初始化操作
 * 形参: 无
 * 返回: 无
 * 说明: ADC2_Init函数的形参不能使用或运算初始化多通道ADC 
 ******************************************************************************/
void ADC_Init(void)
{
    /**< 连续转换模式 */
    /**< 使能通道 */
    /**< ADC时钟:fADC1 = fcpu/18 */
    /**< 这里设置了从TIM TRGO 启动转换,但实际是没有用到的*/
    /**  不使能 ADC2_ExtTriggerState**/
    /**< 转换数据右对齐 */
    /**< 不使能通道0的斯密特触发器 */
    /**  不使能通道0的斯密特触发器状态 */
    ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS , ADC1_CHANNEL_0, ADC1_PRESSEL_FCPU_D18,
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL0,DISABLE);
    ADC1_Cmd(ENABLE);
  
}

/**************************************************************************
 * 函数名:Send_ADC_Value
 * 描述  :ADC转换结果显示函数
 * 输入  :AD_Value--ADC转换结果值
 *
 * 输出  :无
 * 返回  :无 
 * 调用  :内部调用 
 *************************************************************************/
void Send_ADC_Value(u16 AD_Value)
{
    UART2_SendByte(AD_Value/1000+0x30);
    UART2_SendByte(AD_Value%1000/100+0x30);
    UART2_SendByte(AD_Value%1000%100/10+0x30);
    UART2_SendByte(AD_Value%1000%100%10+0x30);
}
/**************************************************************************
 * 函数名:MultipleChannelGetADValue
 * 描述  :打印ADC多通道读取AD值
 * 输入  :无
 *
 * 输出  :无
 * 返回  :无 
 * 调用  :外部调用 
 *************************************************************************/
void MultipleChannelGetADValue(void)
{
UART2_printf(" 当前AD Channel is ADC1_CHANNEL_0,Value=%d ",
            OneChannelGetADValue(ADC1_CHANNEL_0,ADC1_SCHMITTTRIG_CHANNEL0));
    //printf(" 当前AD Channel is ADC1_CHANNEL_0,Value=%d ",
            OneChannelGetADValue(ADC1_CHANNEL_0,ADC1_SCHMITTTRIG_CHANNEL0));
    Delay(0xffff);
UART2_printf(" 当前AD Channel is ADC1_CHANNEL_1,Value=%d ",
            OneChannelGetADValue(ADC1_CHANNEL_1,ADC1_SCHMITTTRIG_CHANNEL1));
   // printf(" 当前AD Channel is ADC1_CHANNEL_1,Value=%d ",
            OneChannelGetADValue(ADC1_CHANNEL_1,ADC1_SCHMITTTRIG_CHANNEL1));
    Delay(0xffff);
    
}
/*******************************************************************************
 * 名称: OneChannelGetADValue
 * 功能: ADC1单通道选择读取AD值
 * 形参: ADC1_Channel,ADC1_SchmittTriggerChannel
 * 返回: 该通道的AD值
 * 说明: 当要读取多通道AD值采调用该函数,否则只是初始化ADC_Init即可 
 ******************************************************************************/
static uint16_t OneChannelGetADValue(ADC1_Channel_TypeDef ADC1_Channel,
                                     ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel)
{
    uint16_t ADConversion_Value;
    /**< 连续转换模式 */
    /**< 使能通道 */
    /**< ADC时钟:fADC1 = fcpu/18 */
    /**< 这里设置了从TIM TRGO 启动转换,但实际是没有用到的*/
    /**  不使能 ADC1_ExtTriggerState**/
    /**< 转换数据右对齐 */
    /**< 不使能通道10的斯密特触发器 */
    /**  不使能通道10的斯密特触发器状态 */
    ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS , ADC1_Channel, ADC1_PRESSEL_FCPU_D18,
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SchmittTriggerChannel,DISABLE);
    ADC1_Cmd(ENABLE);
    ADC1_StartConversion();
    ADConversion_Value = ADC1_GetConversionValue();
    return ADConversion_Value;
}

aleelau
5楼-- · 2019-07-20 11:33
回复【3楼】xuande:
---------------------------------
我是把ADC的值通过串口打印出来看的
234280158@qq.co
6楼-- · 2019-07-20 14:49
 精彩回答 2  元偷偷看……

一周热门 更多>