查看: 3707|回复: 2

[求助] MAPS四色板开发平台K64之神奇的LED灯

[复制链接]

该用户从未签到

11

主题

54

帖子

0

注册会员

Rank: 2

积分
123
最后登录
2018-5-8
发表于 2015-7-15 17:10:03 | 显示全部楼层 |阅读模式
来自与非ECBC: ECBC_zhy

飞思卡尔的FAE介绍了利用四色板开发应用的软硬件环境,并安排了两个迷你Project,运用IAR编程实现。经过调试,程序基本上调通,总结下调试过程,实验报告仅供参考,欢迎拍砖。


实验一:用四色板上的电位计模拟ADC,用其电位并控制PWM输出,调节板上LED亮度。

实验准备:四色板(MCU主板和外设板),安装好的IAR,烧录并安装好Jlink驱动,串口调试助手Putty,杜邦线;

下面将从以下几点分别介绍该实验:

1、硬件介绍
2、ADC介绍及参数设置
3、PWM介绍及参数设置
4、软件流程图及主要函数
5、实验结果展示
硬件介绍

实验用到外设板的电位计,这里我采用了电位计RV2来控制灯LED2的亮度,由于PWM输出引脚并未与LED2,因此需要用杜邦线连接这两个引脚,即用杜邦线连接Dock板上的LD2与主板上的PortA的7脚,PTA7,这样PWM的输出就连接到了LED2的阴极。

飞思卡尔四色板MAPS K64之神奇的LED灯1.png

飞思卡尔四色板MAPS K64之神奇的LED灯2.png



这样硬件就配置好了,比较简单~

下面首先介绍下,这个小实验用到的ADC、FTM/PWM相关的寄存器。

ADC介绍及参数设置

K64的ADC具有24个单端输入采集引脚,4对差分输入,每对差分两个输入引脚DADPx和DADMx;
主要需要配置的寄存器包括:ADC模块的时钟、转换为单端还是缠粉、转换精度、触发源、转换通道。
(1)配置寄存器1(ADCx_CFG1)
配置ADC运行模式、时钟源、时钟分频、配置低功耗、配置采样长时间

ADLPC——低功耗配置;

ADIV——时钟分频选择;

ADLSMP——采样时间配置;

MODE——转换模式选择,

00:DIFF=0时,单端8位精度转换            01:单端12位,

10:单端10位                                           11:单端16位,差分模式下分别为9、13、11、16的精度;

ADICLK——输入时钟选择

00:总线时钟                                            01:总线时钟2分频,

10:备用时钟(ALTCLK)                        11:异步时钟(ADACK)

飞思卡尔四色板MAPS K64之神奇的LED灯3.png

(2)ADC状态和控制寄存器1(ADCx_SC1n)分两个寄存器,SC1A和SC1B,这两个寄存器跟软件和硬件触发模式有关,

COCO——转换完成标志,只读位;
AIEN——中断使能;
DIFF——差分模式使能;
ADCH——输入通道选择;

飞思卡尔四色板MAPS K64之神奇的LED灯4.png

(3)ADC状态和控制寄存器2(ADCx_SC2)

SC2寄存器包括转换活跃、硬件/软件触发选择、比较功能和电压参考选择等配置。
ADACT——转换活跃,说明当前状态是正在转换还是没有在转换;
ADTRG——转换触发选择,可以配置为软件触发或硬件触发;
ACFE——比较功能的配置,禁用或使能比较功能;
ACFGT——比较功能大于使能;
ACREN——比较功能范围使能,ACREN配置该值来检查转换结果是否在范围内;
DMAEN——DMA使能,ADC转换完成后会置位COCO标志,并触发一个DMA请求;
REFSEL——电压参考选择,用于转换的电压参考源。
(4)ADC状态和控制寄存器3(ADCx_SC3)

ADCx_SC3寄存器控制ADC模块的校准、连续转换以及硬件平均功能。
CAL——校准,置位CAL的时候开始一个校准序列。
CALF——校准失败标志,0:校准正常完成,1:校准失败
ADCO——连续转换使能
AVGE——硬件平均使能。0:硬件平均功能禁用,1:硬件平均功能使能
AVGS——硬件平均选择,决定多少个ADC转换平均作为一个输出结果
00:4个采样平均            01:8个采样平均

10:16个采样平均          11:32个采样平均

FTM/PWM介绍及参数设置

FTM是定时器模块,包括寄存器可分为两组,一组是原始的TPM寄存器,另一组是FTM特定的寄存器。

(1)状态和控制寄存器(FTMx_SC)
SC寄存器包括溢出状态标志和用来配置中断使能、FTM配置、时钟源和预分频系数的控制位

(2)计数器寄存器(FTMx_CNT)
CNT寄存器包含FTM模块的计数器值,复位将清空该寄存器,向COUNT写任何值都将使它等于初始值CNTIN,其中COUNT是当前计数器的值。

(3)模寄存器(FTMx_MOD)
模寄存器包含FTM计数器的模数

(4)通道n状态和控制寄存器(FTMx_CnSC)
CnSC寄存器包含通道中断标志和用来配置中断使能、通道配置、引脚功能的控制位

(5)通道n值寄存器(FTMx_CV)
该寄存器包含输入模式时捕获的FTM计数值或输出模式的匹配值,在输入捕获模式、捕获测试和双边缘捕获模式中,对CnV寄存器的任何写操作被忽略。

PWM驱动函数,即HAL层,应该包括初始化频率、打开相应的PWM输出通道以及改变占空比,FTM有3个模块通道,FTM0、FTM1、FTM2。

主要是软件编程,当然可以参考ADC采样和FTM PWM的Demo程序,有现成的,需要理解每个函数,并在此基础上稍作修改就可以完成这个小实验。

程序流程图如下:

飞思卡尔四色板MAPS K64之神奇的LED灯5.png

实验结果:

注意:电位计的旋钮位置和LED灯的亮度,前后两次发生了变化,即用电位计调节小灯亮度。

飞思卡尔四色板MAPS K64之神奇的LED灯6.png

飞思卡尔四色板MAPS K64之神奇的LED灯7.png



附录:主要代码

1、首先,初始化;

hardware_init();

//硬件初始化

OSA_Init();

//初始化实时系统,主要是时钟

dbg_uart_init();

//调试串口初始化,用于串口打印,便于调试程序

2、校正ADC,即电位计

ADC_DRV_GetAutoCalibrationParam(HW_ADC0, &MyAdcCalibraitionParam);

ADC_DRV_SetCalibrationParam(HW_ADC0, &MyAdcCalibraitionParam);

先获得自动校正参数,主要是使能ADC内部时钟,这里的校正参数可以用结构体自行定义,也可以默认不定义,内部会以ADC最高精度进行校正,再设置初始化ADC,这里设置成了中断模式,一些参数定义如下:

* .intEnable = true;

* .lowPowerEnable = true;

* .clkDividerMode = kAdcClkDividerInputOf8;

* .resolutionMode = kAdcResolutionBitOf12or13;

* .clkSrcMode = kAdcClkSrcOfAsynClk;

* .asyncClkEnable = true;

* .highSpeedEnable = false;

* .hwTriggerEnable = false;

* .dmaEnable = false;

* .refVoltSrcMode = kAdcRefVoltSrcOfVref;

* .continuousConvEnable = true;

3、初始化中断模式

ADC_DRV_StructInitUserConfigForOneTimeTriggerMode(&MyAdcUserConfig);

MyAdcUserConfig.resolutionMode = kAdcResolutionBitOf12or13;

ADC_DRV_Init(HW_ADC0, &MyAdcUserConfig, &MyAdcState);

//这里的电位计是12位的ADC,范围0-4095

4、FTM配置及初始化

configure_ftm_pins(BOARD_FTM_INSTANCE);

ftm_user_config_t ftmInfo;

memset(&ftmInfo, 0, sizeof(ftmInfo));

FTM_DRV_Init(BOARD_FTM_INSTANCE, &ftmInfo);

5、采集ADC数值

//Get Voltage value

adcValue_RV2= getVoltage(0, false, MyAdcUserConfig.resolutionMode);

getVoltage函数的第一个参数是电位计ADC的通道Number,0是RV2,第二个参数是是否差分,false是不差分,第三个参数是ADC分辨率模式,这里是12位ADC;

6、将采集的ADC转化为整数和小数,再转化为PWM输出的占空比

if(adcValue_RV2 < 0)

{

adcValue_RV2 = -adcValue_RV2;

isNegative = 1;

}

integer = (adcValue_RV2 * VREF_ADC) / denominator;

numerator = (adcValue_RV2 * VREF_ADC) - (integer * denominator);

decimal = (numerator*ADJUST_FACTOR) / (RES_MAX_VAL * 10);

FTM_DRV_PwmStart(BOARD_FTM_INSTANCE, &ftmParam, BOARD_FTM_CHANNEL);

OSA_TimeDelay(50); //delay 50ms

FTM_DRV_PwmStop(BOARD_FTM_INSTANCE, &ftmParam, BOARD_FTM_CHANNEL);

ftmParam.uDutyCyclePercent =(integer*ADJUST_FACTOR+decimal)/1000;


欢迎指点我的另外的帖子:
飞思卡尔MAPS四色板开发平台上手总结

我知道答案 目前已有2人回答

评分

参与人数 1NXP金币 +30 收起 理由
小七 + 30 打赏!

查看全部评分

回复

使用道具 举报

  • TA的每日心情
    擦汗
    2022-3-3 09:56
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    106

    主题

    836

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    1527
    最后登录
    2023-6-12
    发表于 2015-7-15 21:00:22 | 显示全部楼层
    很详细 的说,感谢分享。
    捕获.PNG
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16800
    最后登录
    1970-1-1
    发表于 2015-7-15 21:38:28 | 显示全部楼层
    多谢分享,学习了
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-21 03:15 , Processed in 0.091260 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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