• 速度上手LM4F LaunchPad 输出多路PWM波


    最近转战到TI的Cortex M4平台后,发现网上关于TI的LM4F120 Launchpad 资料太少了,而且其中大部分都是TI员工或者其合作伙伴提供的,例程太少,导致新手上手很慢。

    我只是要实现几路PWM波输出而已,昨天努力了一天,发现并不容易,至少没有找到可参考的例程,好在我不断地找资料,最后终于写出来了,特贴在此,供新手参考
    另外,在写程序之前,还有很多要说和要做的。
      

    首先,拿到LM4F120 Launchpad,首先要做的就是装好开发环境,我用的是CCS 5.2.1,算是很新的了。在新建工程之前,还有两个工作要做,就是安装Stellaris ICDI的驱动程序和TI提供的Stellaris驱动库,即 StellarisWave。文档“StellarisWare软件库说明.pdf”详细说明了其安装后的文件分布。其中,外设驱动库有一份周立功翻译的文档,叫  Stellaris外设驱动库。  然后新建工程,记着目标型号选 LM4F120H5QR,Connection选 “Stellaris In-Circuit Debug Interface”。然后,剩下的工作一定要按照 “怎样使用CCS5创建Stellaris的新工程.pdf”里面所说的,当然我们的板子的型号是“ek-lm4f120xl”而非“ek-lm4f232”,要不然很容易报错。

    剩下的就是写代码了。先说说我代码的大概逻辑吧,使用Timer0~Timer3产生八路周期一致的占空比互补的PWM波,通过PB的八个GPIO输出,当然,周期和占空比你都可以任意设置。

    这算是我第一次发帖吧,可能有点乱,仅供新手参考。

    程序是参考TI社区一提问者的,我只是把其中一路变成了八路。出处:http://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/259898.aspx

    下面上代码。至于文中提到的那些文档,大家可以按名字从网上搜,稍等会我也上传到网盘里,因为资料很杂,所以整理起来还是有些上火。

    注意:LM4F120H5QR 本身是没有PWM模块的,只能使用Timer模块产生
    以上资料打包下载:
    https://skydrive.live.com/redir?resid=C96C6EC8AD8DCFEA!4146

    #include "inc/hw_memmap.h" 
    #include "inc/hw_types.h" 
    #include "driverlib/pwm.h" 
    #include "driverlib/gpio.h" 
    #include "driverlib/sysctl.h" 
    #include "utils/uartstdio.h" 
    #include "driverlib/timer.h"
    
    int delta=5; 
    int value=1;
    
    void InitTimerPWM(int fullValue) {
        SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); 
        SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1); 
        SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2); 
        SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER3);
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    
        GPIOPinTypeTimer(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1 | 
    		GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | 
    		GPIO_PIN_6 | GPIO_PIN_7 );
    
        GPIOPinConfigure(GPIO_PB0_T2CCP0); 
        GPIOPinConfigure(GPIO_PB1_T2CCP1); 
        GPIOPinConfigure(GPIO_PB2_T3CCP0); 
        GPIOPinConfigure(GPIO_PB3_T3CCP1); 
        GPIOPinConfigure(GPIO_PB4_T1CCP0); 
        GPIOPinConfigure(GPIO_PB5_T1CCP1); 
        GPIOPinConfigure(GPIO_PB6_T0CCP0); 
        GPIOPinConfigure(GPIO_PB7_T0CCP1);
    
        TimerConfigure(TIMER0_BASE, TIMER_CFG_16_BIT_PAIR | 
    		TIMER_CFG_A_PWM | TIMER_CFG_B_PWM ); 
        TimerLoadSet(TIMER0_BASE, TIMER_A, fullValue); 
        TimerLoadSet(TIMER0_BASE, TIMER_B, fullValue); 
        TimerEnable(TIMER0_BASE, TIMER_BOTH); 
        TimerMatchSet(TIMER0_BASE, TIMER_A, 0); 
        TimerMatchSet(TIMER0_BASE, TIMER_B, 0);
    
        TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | 
    		TIMER_CFG_A_PWM | TIMER_CFG_B_PWM ); 
        TimerLoadSet(TIMER1_BASE, TIMER_A, fullValue); 
        TimerLoadSet(TIMER1_BASE, TIMER_B, fullValue); 
        TimerEnable(TIMER1_BASE, TIMER_BOTH); 
        TimerMatchSet(TIMER1_BASE, TIMER_A, 0); 
        TimerMatchSet(TIMER1_BASE, TIMER_B, 0);
    
        TimerConfigure(TIMER2_BASE, TIMER_CFG_16_BIT_PAIR | 
    		TIMER_CFG_A_PWM | TIMER_CFG_B_PWM ); 
        TimerLoadSet(TIMER2_BASE, TIMER_A, fullValue); 
        TimerLoadSet(TIMER2_BASE, TIMER_B, fullValue); 
        TimerEnable(TIMER2_BASE, TIMER_BOTH); 
        TimerMatchSet(TIMER2_BASE, TIMER_A, 0); 
        TimerMatchSet(TIMER2_BASE, TIMER_B, 0);
    
        TimerConfigure(TIMER3_BASE, TIMER_CFG_16_BIT_PAIR | 
    		TIMER_CFG_A_PWM | TIMER_CFG_B_PWM ); 
        TimerLoadSet(TIMER3_BASE, TIMER_A, fullValue); 
        TimerLoadSet(TIMER3_BASE, TIMER_B, fullValue); 
        TimerEnable(TIMER3_BASE, TIMER_BOTH); 
        TimerMatchSet(TIMER3_BASE, TIMER_A, 0); 
        TimerMatchSet(TIMER3_BASE, TIMER_B, 0);
    
    }
    
    void updatePWM(int fullValue) {
        if(value<=0 ||value>=fullValue) 
            delta=-delta; 
        value+=delta;
    
        TimerMatchSet(TIMER0_BASE, TIMER_A, value); 
        TimerMatchSet(TIMER0_BASE, TIMER_B, fullValue-value); 
        TimerMatchSet(TIMER1_BASE, TIMER_A, value); 
        TimerMatchSet(TIMER1_BASE, TIMER_B, fullValue-value); 
        TimerMatchSet(TIMER2_BASE, TIMER_A, value); 
        TimerMatchSet(TIMER2_BASE, TIMER_B, fullValue-value); 
        TimerMatchSet(TIMER3_BASE, TIMER_A, value); 
        TimerMatchSet(TIMER3_BASE, TIMER_B, fullValue-value); 
        SysCtlDelay(SysCtlClockGet()/100); 
    }
    
    int main(void) {
        SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | 
    		SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
        int valueMax=SysCtlClockGet()/10000;
        InitTimerPWM(valueMax);
        while(1) { 
            updatePWM(valueMax); 
        }
    }
  • 相关阅读:
    Centos7 JDK8安装配置
    select2
    docker 删除多个退出的容器
    redis 批量删除多个key
    Dockerfile 文件命令
    Docker部署go示例
    php 导入 excel 文件
    rabbitmq安装
    rabbitmq之php客户端使用实例
    k8s
  • 原文地址:https://www.cnblogs.com/sanwave/p/3282071.html
Copyright © 2020-2023  润新知