本帖最后由 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通道选择位,具体如参考手册所示
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结果获取
- unsigned short ADC_GetResult( unsigned char channel)
- {
- ADC_SC1 = channel; // ADC通道
- while( !ADC_SC1_COCO );
- return ADC_R;
- }
复制代码 (2)为使结果准确可对ADC数值进行一些处理
- uiADC_Value = ADC_GetResult(POTENTIO_ADC_CHANNEL);//获取ADC结果,剔除首次采样值
- for (i=0; i<10; i++)//获取ADC结果求平均值
- {
- uiADC_Value_temp = ADC_GetResult(POTENTIO_ADC_CHANNEL);
- uiADC_Value_temp += uiADC_Value;
- uiADC_Value = (unsigned short)(uiADC_Value_temp/2);
- }
复制代码 (3)这时就可以用采到的数据完成相应功能了,这里放的就是官方例程中滑动电位器的那个程序
- //从电位器引脚获取ADC结果
- uiADC_Value_temp = ADC_GetResult(POTENTIO_ADC_CHANNEL);
- //获取ADC结果求平均值
- uiADC_Value_temp += uiADC_Value;
- uiADC_Value = (unsigned short)(uiADC_Value_temp/2);
- //当电位器转动时,检查ADC值的变化
- if (uiADC_Value > (0xFFF/8)*7)
- {
- LED_Switch(8);
- DelayMS(500);
- LED_Switch(0);
- printf ("Potentiometer test: PASSED\n");
- printf("\n");
- return;
- }
- else if (uiADC_Value > (0xFFF/8)*6)
- {
- LED_Switch(7);
- }
- else if (uiADC_Value > (0xFFF/8)*5)
- {
- LED_Switch(6);
- }
- else if (uiADC_Value > (0xFFF/8)*4)
- {
- LED_Switch(5);
- }
- else if (uiADC_Value > (0xFFF/8)*3)
- {
- LED_Switch(4);
- }
- else if (uiADC_Value > (0xFFF/8)*2)
- {
- LED_Switch(3);
- }
- else if (uiADC_Value > (0xFFF/8)*1)
- {
- LED_Switch(2);
- }
- else
- {
- LED_Switch(1);
- }
复制代码
(按:不知不觉就31号了,越拖延就越想鸽......)
参考资料:
[1]MC9S08PT60芯片手册
[2]MC9S08PT60数据手册
[3]MC9S08PT60官方教程
[4]官方例程S08P_LITE_SAMPLES
[5]S08P_Lite说明书
|