打印
[STM8]

STM8S的ADC例程

[复制链接]
3764|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhuomuniao110|  楼主 | 2017-6-23 12:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用PB口的AIN功能,实现AD转换。一个旋钮式电位器从PB3(AIN3)输入,转换后的信号经PD3(TIM2_CC2)输出至LED。想要的现象:调节电位器,LED的亮度会随之变化。
/***************************************

**文件名称:main.c

**外部晶振:8MHz

**CPU型号:stm8s105s4

**端口说明:LED-------PD3(TIM2_CC2)

**          电位器----PB3(AIN3)

****************************************/

#include"stm8s105c_s.h"



unsigned int AD_Value;    // AD转换后的值存放在这里



void CLK_Init(void)

{

    CLK_CKDIVR &=~(0x10);    // fHSI = fHSI RC/2=8MHz

    CLK_CKDIVR |=0x01;    /* fCPU = fMASTER/2=1MHz

                             默认上电后,主时钟使用HSI RC/8=2MHz */

}



void GPIO_Init(void)

{

    PD_DDR |=0x08;

    PD_CR1 |=0x08;  // 配置PD3为推挽输出

    PD_CR2  =0x00;  // 输出速率=2MHz

}



void TIM2_Init(void)

{

    TIM2_PSCR =0x00;    // TIM2不分频

    TIM2_CR1 |=0x01;    // 使能TIM2计数器

    TIM2_ARRH =0x00;

    TIM2_ARRL =0xFF;    // 计数重装值=256



    // 控制LED的亮度   

    TIM2_CCR2   =0x00;

    TIM2_CCMR2 |=0x70;    // TIM2配置为PWM2模式

    TIM2_CCER1 |=0x30;    // CC通道配置为输出使能、低有效

}



void ADC_Init(void)

{

    ADC_CR1  =0x00;    // fADC = fMASTER/2,复位即进入低功耗模式

    ADC_CR2  =0x00;    // 默认左对齐

    ADC_CSR  =0x03;    // AD输入通道 =PB3(AIN3)

}



void LED_Control(void)

{

    unsigned int i;

    ADC_CR1 |=0x01;    // 开启ADC
    i=6;
    while(i--);
    ADC_CR1 |=0x01;    // 从低功耗模式中唤醒ADC



    while(!(ADC_CSR &0x80));    // 等待转换完成
    AD_Value =((((unsigned int)ADC_DRH)<<2)+ADC_DRL);    // 结果送入AD_Value缓冲区

    TIM2_CCR2H =0x00;
    TIM2_CCR2L =(unsigned char)(AD_Value>>2);   // 结果由PD3口送出至LED

}



void main(void)

{

    _asm("sim");

    CLK_Init();

    GPIO_Init();

    TIM2_Init();

    ADC_Init();

    _asm("rim");

    while(1)

    {

        LED_Control();

    }

}


沙发
zhuomuniao110|  楼主 | 2017-6-23 12:05 | 只看该作者
这么简单的东西,差点出了个错误。那就是没有使能ADC(ADC_CR1=0x01),结果猛调电位器,看到的只是最小阻值位置时灯熄灭,其它阻值处亮度一致最亮的乱像。

使用特权

评论回复
板凳
zhuomuniao110|  楼主 | 2017-6-23 12:07 | 只看该作者
           STM8S103F3P6   AD转换设置问题



1.其它的设置都很简单,仅需注意一个地方:开启AD转换时要延迟一下,延迟后需再开启一次方可。main中如下:

       ADC_CR1|=0x01;   //启动转换
       DelayMS(1);
       ADC_CR1|=0x01;   //启动转换 important
       while(!(ADC_CSR&0x80)); // 等待ADC结束
       ADC_CSR &= 0X7F;         //清除中断标志

使用特权

评论回复
评论
xmshao 2017-6-23 12:24 回复TA
是的 开启AD模块后 在做ADC转换前 延时7US左右 
地板
mmuuss586| | 2017-6-23 12:09 | 只看该作者
谢谢分享

使用特权

评论回复
5
zhuomuniao110|  楼主 | 2017-6-29 11:03 | 只看该作者
看来有懂行的高手啊,我是看不错转发的。

使用特权

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

本版积分规则

188

主题

3241

帖子

10

粉丝