查看: 1495|回复: 1

【S08P闯关赛经验分享】(六)S08P-Lite ADC测试

[复制链接]
  • TA的每日心情
    擦汗
    2023-12-24 19:50
  • 签到天数: 56 天

    [LV.5]常住居民I

    7

    主题

    95

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    374
    最后登录
    2023-12-24
    发表于 2020-7-31 18:25:04 | 显示全部楼层 |阅读模式
    本帖最后由 xyzml 于 2020-7-31 18:28 编辑

    我们直插主题吧
    S8PT60A ADC功能具有以下主要特点
    (1)最高12位的ADC采样
    (2)16个外部输入,5个内部输入(温度等),有外接模拟参考电压引脚
    (3)最多8个深度的FIFO(先进先出队列)

    寄存器(8组)
    状态控制寄存器ADC_SCx,      x=1,2,3,4
    转换结果寄存器ADC_RH:ADC_RL
    比较数值寄存器ADC_CVH:ADC_CVL
    引脚控制寄存器ADC_APCTLx,     x=1, 2
    SC1主要用来选择通道,以及转换的控制、转换的标志位
    SC2是对ADC采样方式的一些具体配置
    SC3是有关ADC部分时钟、功耗、采样精度的相关配置
    SC4是有关FIFO相关配置

    ADC_SC1
    [7] COCO 转换完成标志位(只读) ,1是完成0是没完成
    当FIFO函数被启用时,在完成一组FIFO转换后设置COCO标志
    [6] AIEN中断使能标志位,1是使能0是禁用
    [5] ADCO连续转换使能位,1是连续转换 0是单次转换,FIFO函数被启用时还是按组算
    [4:0]ADCH ADC通道选择位,具体如参考手册所示
    ADC1.png ADC2.png


    ADC_SC2
    [7]ADACT 转换活动标志位(只读) ,1是转换进行中,0是没进行转换
    [6]ADTRG 转换触发选择位,1是硬件触发,0软件触发
    [5]ACFE 比较使能位,1是使能,0是禁用
    [4]ACFGT 比较触发方式位,1是大于等于比较触发,0是小于时触发
    [3]FEMPTY FIFO数据空标志位(只读),1是FIFO无新数据,0是FIFO有新数据
    [2]FFULL FIFO满标志位(只读) 1是FIFO满了,0是FIFO没满
    [1:0] 保留

    ADC_SC3
    [7]ADLPC  功耗配置,1为低功耗模式,0为告诉模式
    [6:5]ADIV  分频选择00-11分频系数分别为1,2,4,8
    [4]ADLSMP  采样时间配置,1为长采样时间,0为短采样时间
    [3:2]MODE  模式转换选择,00是8位,01是10位,10是12位
    [1:0]ADICLK 时钟配置,00总线时钟,01二分之一总线时钟,10交替时钟,11异步时钟

    ADC_SC4
    [7,4,3]保留   
    [6]ASCANE   FIFO扫描模式使能位,1为使能
    [5]ACFSEL   FIFO-COCO触发方式选择,1为与比较,0为或比较
    [2:0]AFDEP   FIFO深度选择,000为禁用,AFDEP数为n深度为n+1(n=1~7)

    ADC_RH:RL   转换结果寄存器,存放转换结果,只读

    ADC_CVH:CVL 比较值寄存器,12位AD模式下存放高4位比较值

    ADC_APCTLx  ADC引脚配置使用ADC引脚,禁用相应IO功能
    ADC_APCTL2:ADC_APCTL1从高到低分别对应引脚AD15~AD0


    ADC功能配置步骤如下:
    (1)配置寄存器ADC_APCTLx,禁止相关管脚 I/O 口功能;
    (2)配置寄存器 ADC_SC3,配置时钟源、时钟分频、工作模式;
    (3)配置寄存器 ADC_SC1,选择通道;

    (4)如需更具体AD采样配置,配置寄存器 ADC_SC2;
    (5)如需使用FIFO,配置寄存器 ADC_SC4;


    代码基本上与教程和论坛的类似,这里就不详细放了哈~
    (1)ADC结果获取
    1. unsigned short ADC_GetResult( unsigned char channel)
    2. {
    3.         ADC_SC1 = channel; // ADC通道
    4.         while( !ADC_SC1_COCO );
    5.         return ADC_R;
    6. }
    复制代码
    (2)为使结果准确可对ADC数值进行一些处理

    1. uiADC_Value = ADC_GetResult(POTENTIO_ADC_CHANNEL);//获取ADC结果,剔除首次采样值
    2.         for (i=0; i<10; i++)//获取ADC结果求平均值
    3.         {
    4.             uiADC_Value_temp = ADC_GetResult(POTENTIO_ADC_CHANNEL);

    5.             uiADC_Value_temp += uiADC_Value;

    6.             uiADC_Value = (unsigned short)(uiADC_Value_temp/2);
    7.         }
    复制代码
    (3)这时就可以用采到的数据完成相应功能了,这里放的就是官方例程中滑动电位器的那个程序
    1. //从电位器引脚获取ADC结果
    2.                 uiADC_Value_temp = ADC_GetResult(POTENTIO_ADC_CHANNEL);
    3.                 //获取ADC结果求平均值
    4.                 uiADC_Value_temp += uiADC_Value;
    5.                 uiADC_Value = (unsigned short)(uiADC_Value_temp/2);

    6.                 //当电位器转动时,检查ADC值的变化
    7.                 if (uiADC_Value > (0xFFF/8)*7)
    8.                 {
    9.                         LED_Switch(8);
    10.                     DelayMS(500);
    11.                         LED_Switch(0);
    12.                     printf ("Potentiometer test: PASSED\n");
    13.                     printf("\n");
    14.                     return;
    15.                 }
    16.                 else if (uiADC_Value > (0xFFF/8)*6)
    17.                 {
    18.                         LED_Switch(7);
    19.                 }
    20.                 else if (uiADC_Value > (0xFFF/8)*5)
    21.                 {
    22.                         LED_Switch(6);
    23.                 }
    24.                 else if (uiADC_Value > (0xFFF/8)*4)
    25.                 {
    26.                         LED_Switch(5);
    27.                 }
    28.                 else if (uiADC_Value > (0xFFF/8)*3)
    29.                 {
    30.                         LED_Switch(4);
    31.                 }
    32.                 else if (uiADC_Value > (0xFFF/8)*2)
    33.                 {
    34.                         LED_Switch(3);
    35.                 }      
    36.                 else if (uiADC_Value > (0xFFF/8)*1)
    37.                 {
    38.                         LED_Switch(2);
    39.                 }
    40.                 else
    41.                 {
    42.                         LED_Switch(1);
    43.                 }
    复制代码


    (按:不知不觉就31号了,越拖延就越想鸽......)

    参考资料:
    [1]MC9S08PT60芯片手册
    [2]MC9S08PT60数据手册
    [3]MC9S08PT60官方教程
    [4]官方例程S08P_LITE_SAMPLES
    [5]S08P_Lite说明书












    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3302

    主题

    6549

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32045
    最后登录
    2024-4-29
    发表于 2020-8-3 11:07:16 | 显示全部楼层
    感谢分享
    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-29 21:44 , Processed in 0.359560 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表