[STM8] STM8S的ADC例程

[复制链接]
4015|5
 楼主| zhuomuniao110 发表于 2017-6-23 12:05 | 显示全部楼层 |阅读模式
用PB口的AIN功能,实现AD转换。一个旋钮式电位器从PB3(AIN3)输入,转换后的信号经PD3(TIM2_CC2)输出至LED。想要的现象:调节电位器,LED的亮度会随之变化。
  1. /***************************************

  2. **文件名称:main.c

  3. **外部晶振:8MHz

  4. **CPU型号:stm8s105s4

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

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

  7. ****************************************/

  8. #include"stm8s105c_s.h"



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



  10. void CLK_Init(void)

  11. {

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

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

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

  15. }



  16. void GPIO_Init(void)

  17. {

  18.     PD_DDR |=0x08;

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

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

  21. }



  22. void TIM2_Init(void)

  23. {

  24.     TIM2_PSCR =0x00;    // TIM2不分频

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

  26.     TIM2_ARRH =0x00;

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



  28.     // 控制LED的亮度   

  29.     TIM2_CCR2   =0x00;

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

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

  32. }



  33. void ADC_Init(void)

  34. {

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

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

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

  38. }



  39. void LED_Control(void)

  40. {

  41.     unsigned int i;

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



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

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

  50. }



  51. void main(void)

  52. {

  53.     _asm("sim");

  54.     CLK_Init();

  55.     GPIO_Init();

  56.     TIM2_Init();

  57.     ADC_Init();

  58.     _asm("rim");

  59.     while(1)

  60.     {

  61.         LED_Control();

  62.     }

  63. }


 楼主| 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;         //清除中断标志

评论

是的 开启AD模块后 在做ADC转换前 延时7US左右  发表于 2017-6-23 12:24
mmuuss586 发表于 2017-6-23 12:09 | 显示全部楼层
谢谢分享
 楼主| zhuomuniao110 发表于 2017-6-29 11:03 | 显示全部楼层
看来有懂行的高手啊,我是看不错转发的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

233

主题

3529

帖子

11

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