打印
[STM8]

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

[复制链接]
4806|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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不知为啥没被清零

使用特权

评论回复
5
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);
}

使用特权

评论回复
6
gym216|  楼主 | 2015-11-27 19:07 | 只看该作者
insect2006 发表于 2015-11-27 14:33
同楼主最近也在调试STM8S
ADC1_GetConversionValue();这个函数简直看不懂,明明是10bitAD,出来的值常常大 ...

你用库函数哪个版本的?用2.1试试

使用特权

评论回复
7
gym216|  楼主 | 2015-11-28 21:38 | 只看该作者
这个问题真的无解了吗?换了几个版本的例程代码结果都一样,核心板上PB0接到vcc就是910左后,也没有到1023,接到gnd是0.接到可调电源也是这样,后来用个电位器测试结果一样,debug观察寄存器都正常,郁闷了。难道是adc下载的时候要设置选项字节?

使用特权

评论回复
8
tangmix| | 2015-11-30 22:47 | 只看该作者
感觉STM8直接写寄存器反而方便,搞成库很啰嗦

使用特权

评论回复
9
wojiademao| | 2015-12-1 16:44 | 只看该作者
flag_status 是不是跟其他文件中变量有冲突,所以一直是128;单步执行看看这个值什么时候变128的。

使用特权

评论回复
10
gym216|  楼主 | 2015-12-2 10:24 | 只看该作者
wojiademao 发表于 2015-12-1 16:44
flag_status 是不是跟其他文件中变量有冲突,所以一直是128;单步执行看看这个值什么时候变128的。 ...

问题找到了,核心板vdda没有接供电,犯了个低级错误。

使用特权

评论回复
11
Gokenbu| | 2018-5-26 11:40 | 只看该作者
你的问题应该是数据左对齐造成的。
左对齐:u16_adc1_value=10位转换结果+6位“0” (共16位)
右对齐:u16_adc1_value=6位“0”+10位转换结果 (共16位)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

61

帖子

2

粉丝