[STM8] stm8s入门遇到绊脚石,求解惑adc1代码

[复制链接]
 楼主| gym216 发表于 2015-11-26 23:26 | 显示全部楼层 |阅读模式
void Init_ADC(void)
{
        GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT);
        ADC1_DeInit();
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_0, ADC1_PRESSEL_FCPU_D2, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, ENABLE);
ADC1_Cmd(ENABLE);
}
void main(void)
{
  FlagStatus flag_status;
                u16 u16_adc1_value;
                Init_UART2();
                Init_ADC();
/* Infinite loop */
  while (1)
  {
                //Send(0xf0);
                ADC1_StartConversion();
                do{
                        flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
                }
                while(flag_status == RESET); // SET or RESET
                    u16_adc1_value = ADC1_GetConversionValue();
                                ADC1_ClearFlag(ADC1_FLAG_EOC);
                                flag_status = ADC1_GetFlagStatus(ADC1_FLAG_EOC);
                                UART2_sendhex((u16_adc1_value>>8));
                    UART2_sendhex((u16_adc1_value&0xff));
                    UART2_sendstr("\r\n");
  }
  
}
单片机买的淘宝stm8s105k4t6核心板,debug时u16_adc1_value的值,我用可调电源输入大于2.1v时就是1023,小于2.1v就是0。flag_status的值一直是128,ADC1_ClearFlag(ADC1_FLAG_EOC)语句之后还是128不变。ADC1_SCHMITTTRIG_ALL, ENABLE改成ENABLE后情况一样,郁闷搞了一天都没搞通
 楼主| gym216 发表于 2015-11-26 23:29 | 显示全部楼层
ADC1_SCHMITTTRIG_ALL, ENABLE改成DISABLE
gmm2015 发表于 2015-11-27 10:24 | 显示全部楼层
gym216 发表于 2015-11-26 23:29
ADC1_SCHMITTTRIG_ALL, ENABLE改成DISABLE

初学者建议买开发板来学习。
while(1)
{
    if (ADC1_GetFlagStatus(ADC1_FLAG_EOC) != 0)   // ADC 转换结束
    {
        u16_adc1_value = ADC1_GetConversionValue();   // 获取AD值
        ADC1_ClearFlag(ADC1_FLAG_EOC);   // 清除ADC转换完成标志位
        ADC1_StartConversion();   // 启动ADC的下一次转换

        /****发送到串口***/
        UART2_sendhex((u16_adc1_value>>8));
        UART2_sendhex((u16_adc1_value&0xff));
        UART2_sendstr("\r\n");

    }   
}
 楼主| gym216 发表于 2015-11-27 10:43 来自手机 | 显示全部楼层
gmm2015 发表于 2015-11-27 10:24
初学者建议买开发板来学习。
while(1)
{

设置成DISABLE还是一样的情况。调试的时候flash_state 的值一直是128不知为啥没被清零
insect2006 发表于 2015-11-27 14:33 | 显示全部楼层
同楼主最近也在调试STM8S
ADC1_GetConversionValue();这个函数简直看不懂,明明是10bitAD,出来的值常常大于1024!!
我的ADC设置全是默认的最简单设置,单个通道单次转换,左端对齐模式,

看它的代码:

uint16_t ADC1_GetConversionValue(void)
{
  uint16_t temph = 0;
  uint8_t templ = 0;
  
  if ((ADC1->CR2 & ADC1_CR2_ALIGN) != 0) /* Right alignment */
  {
    /* Read LSB first */
    templ = ADC1->DRL;
    /* Then read MSB */
    temph = ADC1->DRH;
   
    temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8));
  }
  else /* Left alignment */
  {
    /* Read MSB first*/
    temph = ADC1->DRH;
    /* Then read LSB */
    templ = ADC1->DRL;
   
    temph = (uint16_t)((uint16_t)((uint16_t)templ << 6) | (uint16_t)((uint16_t)temph << 8));   
  }
  
  return ((uint16_t)temph);
}

 楼主| gym216 发表于 2015-11-27 19:07 | 显示全部楼层
insect2006 发表于 2015-11-27 14:33
同楼主最近也在调试STM8S
ADC1_GetConversionValue();这个函数简直看不懂,明明是10bitAD,出来的值常常大 ...

你用库函数哪个版本的?用2.1试试
 楼主| gym216 发表于 2015-11-28 21:38 | 显示全部楼层
这个问题真的无解了吗?换了几个版本的例程代码结果都一样,核心板上PB0接到vcc就是910左后,也没有到1023,接到gnd是0.接到可调电源也是这样,后来用个电位器测试结果一样,debug观察寄存器都正常,郁闷了。难道是adc下载的时候要设置选项字节?
tangmix 发表于 2015-11-30 22:47 | 显示全部楼层
感觉STM8直接写寄存器反而方便,搞成库很啰嗦
wojiademao 发表于 2015-12-1 16:44 | 显示全部楼层
flag_status 是不是跟其他文件中变量有冲突,所以一直是128;单步执行看看这个值什么时候变128的。
 楼主| gym216 发表于 2015-12-2 10:24 来自手机 | 显示全部楼层
wojiademao 发表于 2015-12-1 16:44
flag_status 是不是跟其他文件中变量有冲突,所以一直是128;单步执行看看这个值什么时候变128的。 ...

问题找到了,核心板vdda没有接供电,犯了个低级错误。
Gokenbu 发表于 2018-5-26 11:40 | 显示全部楼层
你的问题应该是数据左对齐造成的。
左对齐:u16_adc1_value=10位转换结果+6位“0” (共16位)
右对齐:u16_adc1_value=6位“0”+10位转换结果 (共16位)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

62

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

5

主题

62

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部