切换到宽版
  • 4309阅读
  • 7回复

[STM]STM8学习之——ADC模数转换 [复制链接]

上一主题 下一主题
离线zeze10000
 

发帖
2858
M币
8559
专家
35
粉丝
112
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-07-19
今天我们来学学stm8的ADC功能。
stm8单片机的ADC功能还是很强大的,虽然也只有10位的分辨率,但是ADC转换模式多样。
有单次转换、连续转换、单次扫描、连续扫面。在连续模式里还有缓存,用好了能很容易实现多样功能。
stm8还带有ADC看门狗,当ADC值超范围时触发中断。
总的来说就是功能丰富。

先看看结构框图

这是ADC1,有些带的是ADC2.
虚线以上是ADC1特有的。像是缓存区、看门狗都是特有的
这里可以看到stm8内部只有一个ADC转换单元,但是stm8的ADC通道不止一个,所以就需要通过通道切换来完成多通道的转换。

这是单次转换

STM8可以自动的进行连续的转换,你只需要及时读取数据,清转换完成标志。
不用多次触发转换。
多次转换


由于STM8的转换结果有10位,所以需要两个寄存器存放

这里就涉及到了数据的存放方式,分为左对齐和右对齐

今天我们来学习最简单的ADC转换。
单次转换

今天的硬件

一个游戏摇杆,质量有点差,不过不影响实验

首先是看一下ADC端口在哪个引脚,然后再将引脚模式设置为无中断的悬浮输入。
其实也可以不设置,在ADC通道初始化时会断开引脚的输入输出电路模块。
然后设置ADC的分频和开启电源。
接下来是选择数据对齐方式。
然后关掉对应引脚的施密特触发器。
这个触发器不关是不会影响信号输入的,ADC通道使能后它就不起作用了,官方手册只是说推荐关闭以降低功耗。
再接下来再触发一次ADCON位,开始转换。
等待转换结束读取数据就行了。

需要注意的是切换通道后的第一次读取值是不对的,我估计是引脚切换后要初始化引起的,因此切换通道后第一次转换的结果直接丢掉就行了。

看看结果




这里就是摇杆的两通道的数值显示

关于第一次转换不准确的问题,我也没看到哪里有明确的说法。
我在切换通道后延时再开始转换也不行,一定要第二次转换才能得到正确数值。
知道原因的朋友麻烦告知一下,
或者说我的引脚切换过程有问题请告知。
我在程序里直接判断了是否有引脚切换,有切换则执行一次转换,不采信转换值,直接丢弃。

贴上测试程序代码
  1. #include<iostm8s105k4.h>
  2. int x,y;
  3. void init()
  4. {
  5.   CLK_SWCR=0x20; //外部8M时钟,不分频
  6.   CLK_SWR=0xb4;
  7.   CLK_CKDIVR=0x00;
  8.   
  9.   PB_DDR_DDR0=0; //输入端口配置
  10.   PB_CR1_C10=0;  //悬浮输入无中断
  11.   PB_CR2_C20=0;
  12.   
  13.   PB_DDR_DDR1=0; //输入端口配置
  14.   PB_CR1_C11=0;
  15.   PB_CR2_C21=0;
  16.   
  17.   ADC_CR1=0x41; //8分频,开电源
  18.   ADC_CR2=0x08; //数据右对齐
  19.   ADC_TDRL=0x03;//关闭对应IO施密特触发器
  20.   
  21. }
  22. int ADC(char ch) //读ADC值
  23. {      
  24.   int value=0;
  25.   
  26.   if((ADC_CSR&0x0f)!=ch) //判断通道切换
  27.   {
  28.     ADC_CSR&=0x70; //清EOC和通道
  29.     ADC_CSR|=ch;   //写转换通道
  30.   
  31.     ADC_CR1|=0x01; //开始转换,执行一次转换完成初始化
  32.     
  33.     while(!(ADC_CSR&0x80)); //等待转换结束
  34.     ADC_DRH;                 //丢弃第一次转换结果
  35.     ADC_DRL;
  36.     ADC_CSR&=0x7f;           //清EOC
  37.   }
  38.   
  39.   ADC_CR1|=0x01; //开始转换
  40.   while(!(ADC_CSR&0x80)); //等待转换结束
  41.   
  42.   value=ADC_DRH;            //取值,右对齐
  43.   value<<=8;
  44.   value|=ADC_DRL;
  45.   
  46.   ADC_CSR&=0x7f;           //清EOC
  47.   
  48.   return value;           //返回ADC值
  49. }
  50. int ADC_filter(char ch) //滤波,去最大最小值后取平均
  51. {
  52.   unsigned int sum=0;
  53.   int tmp;
  54.   int max=0;
  55.   int min=1024;
  56.   char i;
  57.   
  58.   for(i=0;i<10;i++)     //取样10次
  59.   {
  60.     tmp=ADC(ch);
  61.     if(tmp>max) max=tmp; //取最大值
  62.     if(tmp<min) min=tmp; //取最小值
  63.     sum+=tmp;            //求和
  64.   }
  65.   sum=sum-(max+min);     //去掉最大最小值
  66.   sum>>=3;              //右移3位,相当于除与8
  67.   return sum;           //返回值
  68. }
  69. int main( void )
  70. {
  71.   
  72.   init();
  73.   
  74.   while(1)
  75.   {
  76.     x=ADC_filter(0);
  77.     y=ADC_filter(1);
  78.   }
  79. }


THE END!





STM8首次学习实验~流水灯
http://bbs.mydigit.cn/read.php?tid=2452931

STM8学习之——中断
http://bbs.mydigit.cn/read.php?tid=2453643

STM8学习之——TIMER4定时器
http://bbs.mydigit.cn/read.php?tid=2456190

STM8学习之——timer1输入捕获
http://bbs.mydigit.cn/read.php?tid=2457109

STM8学习之——timer1外部时钟源模式2
http://bbs.mydigit.cn/read.php?tid=2459809

STM8学习之——timer1周期测量
http://bbs.mydigit.cn/read.php?tid=2461507

STM8学习之——周期测量的疑问
http://bbs.mydigit.cn/read.php?tid=2462114

STM8学习之——timer1频率占空比测量
http://bbs.mydigit.cn/read.php?tid=2464249

STM8学习之——timer1 PWM输出
http://bbs.mydigit.cn/read.php?tid=2467013

STM8学习之——AWU自动唤醒
http://bbs.mydigit.cn/read.php?tid=2477122

STM8学习之——BEEP资源
http://bbs.mydigit.cn/read.php?tid=2477224

STM8学习之——IWDG独立看门狗
http://bbs.mydigit.cn/read.php?tid=2477395

STM8学习之——WWDG窗口看门狗
http://bbs.mydigit.cn/read.php?tid=2477802

STM8学习之——UART串口
http://bbs.mydigit.cn/read.php?tid=2479924

STM8学习之——ADC模数转换
http://bbs.mydigit.cn/read.php?tid=2480810

待更新...
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共2条打赏M币+45
66ok66 M币 +30 值得学习,谢谢~ 请继续..... 2018-07-19
udcs M币 +15 謝謝分享 2018-07-19
离线globe

发帖
441
M币
696
专家
1
粉丝
6
只看该作者 1楼 发表于: 2018-07-19
请登录后查看
离线66ok66

发帖
1356
M币
860
专家
10
粉丝
21
只看该作者 2楼 发表于: 2018-07-19
请登录后查看
离线hf325600

发帖
763
M币
1220
专家
3
粉丝
13
只看该作者 3楼 发表于: 2018-07-20
请登录后查看
离线kantu
发帖
60
M币
-12
专家
1
粉丝
4
只看该作者 4楼 发表于: 2018-07-20
请登录后查看
离线zeze10000

发帖
2858
M币
8559
专家
35
粉丝
112
只看该作者 5楼 发表于: 2018-07-20
回 kantu 的帖子
请登录后查看
离线zxm3916

发帖
8
M币
640
专家
1
粉丝
3
只看该作者 6楼 发表于: 2019-05-31
请登录后查看
离线zxm3916

发帖
8
M币
640
专家
1
粉丝
3
只看该作者 7楼 发表于: 2019-05-31
请登录后查看
快速回复
限80 字节
温馨提示:所有技术区严禁灌水,“沙发”“顶”字样;禁止广告贴;以免被删除
 
上一个 下一个