嵌入式技术论坛
直播中

哔哔哔-

8年用户 1271经验值
擅长:电源/新能源
私信 关注
[经验]

如何利用NUC980的PWM来驱动GP8301芯片电路呢

一、测评简介本次评测需要验证NUC980的PWM功能,用NUC980的PWM来驱动GP8301,通过调节PWM0-100%占空比,实现0-20mA电流信号的输出。

二、评测环境
开发软件:RT-Thread Studio
评估板:NUC980-IOT V1.0
烧写工具:NUWriter

三、评测内容
3.1、PWM驱动GP8301电路

GP8301是一种PAC芯片,即以PWM为接口的DAC芯片。GP8301将0%-100%占空比的PWM输入转换成0/4-20mA电流输出。GP8301内置双路12BIT DAC,输出电流线性误差<0.1%。适合应用与各类仪表、工业控制器等产品。

特点:
PWM转0/4-20mA
GP8301输入信号:0%-100% PWM
输入PWM频率:50Hz-50KHz
GP8301分辨率:12 BIT
输出电流线性误差 <0.1%
电源电压:10V - 30V
功耗:<2mA
启动时间:<2ms
工作温度:-40°C to 85°C(125°C)
曲线数据:I2C输入电流输出(100点)
数据:PWM输入电压输出(100点)
使用NUC980的PWM功能来完成对GP8301芯片的驱动,通过调节PWM的占空比,让GP8301输出0-20mA的电流。


3.2、NUC980-PWM概述
NUC980 有 两组 PWM,分别为 PWM0 和 PWM1,每个 PWM 有 4 个独立的 PWM 输出, CH0~CH3, 或者作为两个带有可编程死区发生器的互补的 PWM 对, (CH0, CH1), (CH2, CH3).
每两个 PWM 输出, (CH0, CH1), (CH2, CH3), 共享同一个 8-位预分频, 同一个提供 5 级分频 (1, 1/2, 1/4, 1/8, 1/16) 的时钟分频器. 每个 PWM 输出有一个用于 PWM 周期控制的独立的 16 位PWM 下数型计数器, 和一个用于 PWM 占空比控制的 16 位比较器. 每一个死区发生器有两个输出, 第一个死区发生器的输出是 CH0 和 CH1, 而第二个死区发生器的输出是 CH2 和 CH3. PWM 控制器一共提供 4 个独立的 PWM 中断标志, 当某一个 PWM 周期下数计数器计数到 0 时, 相应的中断标志由硬件置位. 当 PWM 中断源和相应的中断使能位有效时, PWM 中断将会被 触发. 每一个 PWM 输出都可以被配置为单次模式来产生仅一个 PWM 周期的信号, 或者连续模 式来连续输出 PWM 波形.
当 DZEN01 (PWM-PCR[4]) 位被设置为 1 时, CH0 与 CH1 执行互补的 PWM 对功能, 这一对PWM 的时序, 周期, 占空比, 和死区时间由 PWM 通道 0 定时器和死区发生器 0 决定. 同样, 当DZEN23 (PWM-PCR[5]) 位被设置为 1 时, 互补的 PWM 对 (CH2, CH3) 由 PWM 通道 2 控制.
为防止 PWM 驱动输出引脚输出不稳定波形, 16 位周期下数型计数器和 16 位比较器均采用双缓存, 当用户向计数器/比较器缓存寄存器内写入值时, 只有当下数型计数器的值计数到 0 时, 更新的值才会被重载下数型计数器/比较器. 该双缓存特性可以避免 PWM 输出时产生干扰波形.
当 16 位下数型计数器达到 0 时, 中断要求产生. 如果 PWM 输出被设置为连续模式, 当下数计数器计数到 0 时, 下数计数器会重复自动重新装载 PWMx_CNR 寄存器中 CNR 的值, 并开始减计数. 如果 PWM 输出被设置为单次模式, 当下数计数器计数到 0 时, 停止计数, 并产生一个插断要求.
PWM 比较器用于脉冲宽度调制, 当下数计数器的值与比较寄存器的值匹配时, 计数器控制逻辑会改变 PWM 输出电平。

3.3特性
3.3.1、4 个独立的 PWM 输出, 每个通道均带有中断
3.3.2、互补的 PWM 对, (CH0, CH1) 及 (CH2, CH3), 支持程序设计死区发生器
3.3.3、每对 PWM 内部带有 8 位预分频, 以及除频器
3.3.4、高达 16 位的 PWM 计数器以及比较器宽度
3.3.5、每个通道均可设置独立的时钟源
3.3.6、支持单次或连续模式

3.4、方框图


3.5、 PWM 定时器开启过程
以下以设置 PWM 通道 0 当例子, 说明启动 PWM 的步骤.
1). 设置时钟选择器 CLKSEL0 (PWM_CSR[2:0])
2). 设置预分频器 PRESCALE (PWM_PPR[7:0])
3). 设置 CH0INV (PWM_PCR[2]) , 控制输出反转打开或是关闭关闭
4). 设置 DZEN01 (PWM_PCR[4]) 控制死区发生器打开/关闭, 若是死区功能开启, 设置死区间隔
DZL01 (PWM_PPR[23:16])
5). 设置 CH0MOD (PWM_PCR[3]), 选择工作模式是自动重载或是单次模式.
6). 设置中断使能位 PIER0 (PWM_PIER[0])
7). 设置相应管脚为 PWM 功能
8). 将 CH0EN((PWM-PCR[0])) 置 1. 使能 PWM 下数型计数器开始运行,设置 PWMx-CMR 寄存器的和 PWMx_CNR 寄存器位域来设定 PWM 占空比 上述步骤中的 1~8 可以不按照上述的顺序设置,这对 PWM 定时器的正常工作没有影响。

四、代码调试
4.1、建立RT-Thread工程

4.2、RT-Thread设置
在RT-Thread Settings中,PWM默认使能

默认使能PWM0

4.3、PWM引脚设置初始化
在nu_pin_init.c中已对PWM引脚进行初始化,配置PF7和PF8分别为PWM02和PWM03.

static void nu_pin_pwm_init(void)


{

/* PWM02, PWM03: PF[7, 8] */

outpw(REG_SYS_GPF_MFPL, (inpw(REG_SYS_GPF_MFPL) & ~0xF0000000) | 0x40000000);

outpw(REG_SYS_GPF_MFPH, (inpw(REG_SYS_GPF_MFPH) & ~0x0000000F) | 0x00000004);

}

4.4、PWM应用程序-占空比调节
uint32_t dutysetting=0,addflag=0,reduceflag=0;

pwm_dev = (struct rt_device_pwm *)rt_device_find(pwm_name);

rt_pwm_enable(pwm_dev, 2);

rt_pwm_set(pwm_dev, 2, 100000, dutysetting);

通过调节dutysetting来完成占空比调节

4.5、测试
通过测试,程序在运行过程中,可以周期性调节占空比,进而让GP8301产生连续的电流变化,为了观察方便,电流从1-18mA成线性变化。


五、评测感想
RT-Thread在各个行业都有广泛的应用,对个人来讲,这次评测是第一次从零开始接触RT-Thread。RT-Thread Studio界面友好,可以方便的对MCU软件包及外设进行管理,非常适合快速项目应用开发。针对NUC980-IOT板的测试还有很多,以此为契机,把RT-Thread和NUC980应用到实际项目中。



原作者:多明哥

更多回帖

发帖
×
20
完善资料,
赚取积分