第六章.DC-DC 升压模块 1
2
3
4
5
程序通过 PB7 口产生 PWM 波控制 tps61165 工作, 完成 LED 串点亮以及电流控制, 可通过 LCD 开发板上的滚轮调节 PWM 波的占空比进而实现电流的调节 ; 通过 PE2 的 ADC 功能读取电压测量电路中的 OPA330 的输出电压, 并根据电路原理图计算出测量点的电压值, 显示在 LCD 上 ; 通过 PE3 的 ADC 功能读取电流测量电路中的 INA213 的输出, 并根据电路原理图以及 INA213 的放大倍数 (50 倍 ) 计算得出测量点的电流值, 显示在 LCD 上 软件流程图及关键代码分析 1 程序成功烧写后,TIVA LaunchPad 上电后可启动程序运行 程序主循环 2 3 4 LCD 初始化包括 LCD 端口使能 SSI 通信协议配置 LCD 配置初始化 LCD 清屏 4 个步骤 每个步骤详情请见本书第三章 ADC 采样初始化包含 PE0 通道 ( 滚轮电阻 ) 采样初始化,PE2 通道 ( 电压 ) 采样初始化和 PE3 通道 ( 电流 ) 采样初始化 ADC 采样初始化步骤 :1 使能 ADC 模块外设 2 配置相关 GPIO 为 ADC 功能 3 ADC 采样序列配置 4 ADC 采样序列步进配置 5 使能采样序列并清除中断标志 PWM 初始化负责使能并设置 PB7 端口输出周期为 20 KHz 占空比为 25% 的 PWM 信号作为实验的信号源 PWM 波初始化步骤 :1 使能外设 PWM 模块 2 配置相关 GPIO 为 PWM 功能 3 配置 PWM 波生成器 4 设置 PWM 周期和占空比 5 使能 PWM 输出和启动 PWM 发生器的定时器 程序启动 LCD 初始化 ADC 采样初始化 PWM 初始化 LCD 显示字符 1 2 3 4 5 5 读取电压 电流的 AD 采样值并在 LCD 上显示 读取滚轮采样值调节 PWM 占空比 系统延时 结束 是 程序终止 6 7 8 否 5 在 LCD 上显示 LED_Current:xx ma,led_volgate: xx V 等信息, 便于实验过程中观察实验数据变化 7 读取滚轮电阻采样值, 计算新占空比, 若当前占空比跟新计算得出的占空比相差 1% 则新占空比更新至系统使用 占空比控制在 5%-95% 之间 滚轮电阻获取 ADC 采样值的程序部分详见本书第三章 6 读取 PE2(ADC_IN, 电压 ) 采样值, 根据转换公式计算电压值进行 LCD 显示, 读取 PE3(CUR_ADC) 采样值根据转换公式计算电流值进行显示 ADC 采样值读取程序部分可参考本书第三章 8 为防止 LCD 过快重复刷新, 系统进行延时将主循环控制在一个合理的执行速度内 图 xx 程序流程图 6
此次实验程序中需要涉及 LCD 功能模块,ADC 功能模块,PWM 功能模块 其中 LCD 功能模块和 ADC 功能模块的实现可参考本书第三章内容 PWM 功能模块实现 使用 PWM 波首先需要初始化相应功能模块, 初始化过程如程序流程图中所述,PWM 设置中较为关键的是周期的设置, 周期设置由 ROM_PWMGenPeriodSet 或者 PWMGenPeriodSet 设置完成,ROM 版本和非 ROM 版本的函数实现功能相同且参数也相同, 函数原型为 : void PWMGenPeriodSet(uint32_t ui32base, uint32_t ui32gen, uint32_t ui32period); 其中 ui32period 需要计算得到, 该值表示 PWM 发生器输出的周期, 使用时钟节拍来测量, 可通过如下方式计算 : SysPWM _ Fre period OutputPWM _ Fre SysPWM _ Fre 为当前系统 PWM 时钟频率, 该时钟频率通过函数 SysCtlPWMClockSet() 设置 其函数原型为 : void SysCtlPWMClockSet(uint32_t ui32config); ui32config 是 PWM 时钟的配置, 它必须是下面的其中一个值 :SYSCTL_PWMDIV_1 SYSCTL_PWMDIV_2 SYSCTL_PWMDIV_4 SYSCTL_PWMDIV_6 SYSCTL_PWMDIV_8 SYSCTL_PWMDIV_16 SYSCTL_PWMDIV_32 SYSCTL_PWMDIV_64 这个函数提供给 PWM 模块的时钟频率作为一个处理器时钟的系数来设置,PWM 模块使用这个时钟来产生 PWM 信号, 它的速率形成所有 PWM 信号的基础 处理器时钟有函数 SysCtlClockSet() 设置, 故 PWM 的时钟由 SysCtlClockSet() 配置的系统时钟速率决定 例如 : 系统时钟设置为 12.5MHz,PWM 时钟设置为 SYS_PWMDIV_1, 而 PWM 输出信号频率为 20KHz, 可计算得出 PWM 输出信号的时钟节拍值为 : 6 SysPWM _ Fre 12.5 10 /1 12500 period 625 3 OutputPWM _ Fre 20 10 20 7
程序代码如下 : * @brief 初始化 PWM * @param none * @return none * * * M4 PB7 -->M0PWM1 * * * PERIOD_TIME 计算 : 系统时钟使用 12.5MHz( 主函数中设置 ), 需要产生 20KHz 的 * PWM 波,PWM 周期就是 (1/20000), 对于 12.5MHz 的时钟来说就是 12500000*1/20000 * 个时钟节拍, 也就是约去 1000 后 12500/20 的值 *******************************************************************/ #define PERIOD_TIME 12500 / 20 //20KHz, void Init_PWM(void) { 的时钟,1 分频 ROM_SysCtlPWMClockSet(SYSCTL_PWMDIV_1); // 使能 PWM0 外设模块 ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0); // 使能 PB 端口 ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // 配置 GPIO 复用功能为 PWM 模式 ROM_GPIOPinConfigure(GPIO_PB7_M0PWM1); 8
// 配置 PB7 供 PWM 外设使用 ROM_GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_7); // 配置 PWM 发生器,PWM0 模块的,PWM_GEN_0( 发生器 0) 向下计数, 立即更新参数 ROM_PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN PWM_GEN_MODE_NO_SYNC); //PWM 周期设置,20KHz ROM_PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, PERIOD_TIME); // 设置占空比为 25% 的 PWM1 的脉宽 ROM_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1,PERIOD_TIME / 4); } // 使能输出 ROM_PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, true); // 启动发生器 0 的定时器 ROM_PWMGenEnable(PWM0_BASE, PWM_GEN_0); // 使能发生器模块计数器同步 ROM_PWMSyncTimeBase(PWM0_BASE, PWM_GEN_0); 程序中通过 LCD 开发板上的滚轮电阻调节 PWM 波的占空比, 而滚轮电阻数值是通过 Tiva M4 上的 ADC 模块采样得到, 得到滚轮当前值后就可以计算出当前 PWM 波的占空比 其计算公式如下 ( 占空比控制在 5%~95% ): ADCWheel _ Value Cur _ Duty 90 5 ADCMax 式中 ADCWheel _ Value 为当前滚轮电阻的采样值, ADCMax 为滚轮电阻采用的 AD 模块中的最大值,Tiva M4 中的 AD 为 12-bit, 故该值为 ADCWheel Value ADCMax 的值为 0~1 之间, 故 _ 5,95 4096,( _ / ) Cur Duty 9
根据计算公式可以得出如下程序 : // 根据滚轮采样值计算占空比 uint32_t cur_duty = 5 + (90 * pui32adcwheel_value) / ADCMAX; uint32_t period = cur_duty * PERIOD_TIME / 100; // 改变 PWM 波的占空比 ROM_PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, PERIOD_TIME); ROM_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, period); PERIOD _ TIME 也就是通过 #define 宏定义的值, 该值的表示的是 PWM 波的周期, 计算得出的占空比乘以该值即表示这段时间内保持高电平输出, 余下时间保持低电平输出 该控制功能由 TivaWare 库中的函数 ROM_PWMGenPeriodSet 和 ROM_PWMPulseWidthSet 配合完成 实验的程序设计中需要在 LCD 上显示当前电流的电流值和电压值, 电流值和电压值都是采用 ADC 采样获得,ADC 采样配置以及获取采样值跟本书第三章中的滚轮控制部分相似, 故该部分可参考第三章完成 获取 ADC 采样值后需要根据实际电路计算得出实际值 a. 电流电流检测通过 Tiva M4 的 PE3 口的 ADC 功能采样电流测量电路中 INA213 的输出值 LCD 显示的是 INA213 输入端的电流值 ( 电路原理图中的 +IN -IN 端, 即通过 R 3 电阻的电流值 INA213 本身具有 50 倍的增益 电流计算公式如下 : CUR _ ADC ADCRef Current ADCMax 50 R 3 12 根据原理图可知 ADCRef 3.3V, R3 0.5, ADCMax 2 4096 CUR _ ADC 3.3 _ 3.3 40 1000= CUR ADC Current ma 4.96 50 0.5 4096 10
在程序实现中将 Current 扩大 1000 倍, 以方便 LCD 显示模块使用 程序代码如下 unsigned long CUR_ADC_Sample = (pui32cur_adc_value * 3300 * 40) / ADCMAX; b. 电压电压检测通过 Tiva M4 的 PE2 口的 ADC 功能采样电压测量电路中 OPA330 的输出值 而在 LCD 上显示的却是 R 16 和 R 17 的输入端为 TO_BUF( 可见原理图 ), 根据分压可以计算出电压值 计算公式如下 : To _ Buf R R Volt ADCRef ADCMax R 16 17 17 之间的电压,OPA330 12 根据原理图可知 ADCRef 3.3V, ADCMax 2 4096, R16 10k, R17 2k 电压值计算成 mv 方便 LCD 显示模块使用, 程序代码如下 To _ Buf 3.3 6 Volt 1000 mv 4096 unsigned long ADC_IN_Sample = (pui32adc_in_value * 3300 * 6) / ADCMAX; 11
12
13
14
15
16