葡萄糖粉适合什么人喝| 冰激凌和冰淇淋有什么区别| 暴力倾向的人有什么表现| 白蛋白偏高是什么原因| 一级甲等医院是什么意思| 肾阴阳两虚用什么药| 中年人吃什么钙片补钙效果好| 专柜是什么意思| hcv是什么病毒| 长期熬夜吃什么可以补回来| 看情况是什么意思| 妥瑞氏症是什么病| 胰腺炎吃什么水果| 吃什么不会长胖| 鸡汤是什么意思| 30号来的月经什么时候是排卵期| 血管瘤是什么原因引起的| 贤良淑德后半句是什么| 肺部结节灶是什么意思啊| 肋间神经痛吃什么药| 腹胀吃什么药最有效| 10月7日是什么星座| 新生儿脸上有小红点带白头是什么| 100年前是什么朝代| 羊水穿刺是检查什么| 仓鼠能吃什么东西| hm是什么牌子| 大象的天敌是什么动物| 按摩脚底有什么好处| 迪卡侬属于什么档次| 孩子打呼噜是什么原因| 输血浆主要起什么作用| 奇经八脉指的是什么| 什么是强势的女人| pose什么意思| 什么止痛药效果最好| 是什么为什么怎么办| 12月8号什么星座| 三点水加分念什么| 孕期脸上长痘痘是什么原因| 什么是肠梗阻| 超敏crp是什么意思| 啪啪啪是什么意思| 为什么会得乙肝| 小白龙叫什么名字| 胰腺炎吃什么消炎药| 稽留流产是什么意思| 肝部有阴影一般都是什么病| 鸡翅木是什么木| 什么什么大叫| 枸杞泡水喝有什么好处| 扁桃体肥大是什么原因造成的| hpv阳性有什么症状| 贤者模式是什么意思| 脸麻是什么原因| 免疫系统由什么组成| 胸导联低电压什么意思| 双鱼座的幸运色是什么| 水杯什么材质好| 郑字五行属什么| 箨是什么意思| edg是什么意思| 大排畸什么时候做| 尿酸挂什么科| vj是什么| 218是什么意思| 阴囊是什么部位| 代表什么意思| 胎位rsa是什么意思| 正值当年什么意思| 肿瘤患者吃什么药可以抑制肿瘤| 中耳炎不能吃什么食物| 什么吹风机好用| 高温中暑吃什么药| 少一个肾有什么影响| 陈世美是什么样的人| 万事如意是什么生肖| 怀孕是什么感觉| 借你吉言是什么意思| 蟑螂喜欢吃什么| 副研究员什么级别| 见色起意是什么意思| 抽血能检查出什么| 无名指为什么叫无名指| 照猫画虎什么意思| 种植什么好| 早上5点多是什么时辰| 女人小肚子疼是什么原因| 双甘油脂肪酸酯是什么| 黄药是什么| 吊客是什么意思| 补阳气吃什么| 喉咙痛可以吃什么| 尿道口感染吃什么药| 牙龈肿痛看什么科| 肺大泡是什么病| 小孩发烧吃什么药| 月柱金舆是什么意思| 排卵期会有什么症状| 戊五行属什么| 什么是植物神经功能紊乱| 吃什么能排湿气| 特别的意思是什么| 植入是什么意思| 第一颗原子弹叫什么| 胎儿缺氧是什么原因造成的| 嘴唇发麻什么病兆| 什么是门户网站| 柿子与什么食物相克| 自缚是什么意思| 何德何能是什么意思| 保妇康栓是治疗什么的| 气虚血虚吃什么中成药| 大腿内侧疼痛什么原因| 牛骨煲什么汤对儿童好| 什么加什么等于粉色| 小腿发胀是什么原因| 鹅什么时候开始下蛋| 什么的鼓励| 舌苔发黄吃什么药| 外公的妹妹叫什么| 眼睛充血是什么原因| 肝火大吃什么药| 关节退行性改变是什么意思| 什么叫低级别上皮内瘤变| 不疼不痒的红疹是什么| 左眼皮一直跳是什么预兆| 苯磺酸氨氯地平片是什么药| 梦到钱丢了预示着什么| 手足口病吃什么药最好| 下午16点是什么时辰| 胃食管反流咳嗽吃什么药| 狗摇尾巴是什么意思| 梦见打群架是什么意思| 什么是肝癌| 大腿肌肉跳动是什么原因| 6d是什么意思| 熬夜眼睛红血丝用什么眼药水| 仰卧是什么姿势| 多吃海带有什么好处和坏处| jeans什么意思| 晟这个字读什么| 营救是什么意思| 身上长小肉揪是什么原因| 肌酐测定是查什么| 皮牙子是什么意思| 考上公务员意味着什么| 8月出生的是什么星座| 发热挂什么科| 小孩睡觉打呼噜是什么原因| 曙光什么意思| 皮肤有白点是什么原因| 阄是什么意思| cno什么意思| 梦到掉牙齿是什么预兆| 脖子痛挂什么科| 3月27号是什么星座| 水乳是什么| ed是什么病| 特殊是什么意思| 印度人为什么用手抓饭吃| 上火吃什么水果好| 飞机什么不能带| seeyou是什么意思| 财星是什么意思| 囊腺瘤是什么| 西洋参是补什么的| 真狗是什么意思| 什么时候可以查高考成绩| 终止妊娠是什么意思| 交警中队长是什么级别| dazzling什么意思| 东宫是什么意思| 身体出汗多是什么原因| 鱼油功效和作用是什么| 笋壳鱼是什么鱼| 老人脚肿吃什么药消肿| 什么是大姨妈| 出梅是什么意思| 肚脐眼的作用是什么| 老年人晚上夜尿多是什么原因| 每天跑步对身体有什么好处| 美国为什么不打朝鲜| 氟利昂是什么| 慢性非萎缩性胃炎吃什么药效果好| 清明上河图描绘的是什么季节的景象| 长脸适合什么发型| 耷拉的近义词是什么| 血脂血糖高吃什么食物好| 白萝卜不能和什么一起吃| 糖尿病人晚餐吃什么最好| 红豆泥是什么意思| 提辖相当于现在什么官| 烈士家属有什么待遇| 为什么左手会发麻| 男性感染支原体有什么症状| 吃什么会瘦| 幻听是什么原因引起的| be结局是什么意思| 梦见狗咬自己是什么意思| 动土破土是什么意思| 避讳是什么意思| 低头头晕是什么原因| 全身冰凉是什么原因| 4月3日是什么星座| 腰突然疼是什么原因| 陈皮有什么好处| fox是什么意思| 笄礼是什么意思| 植物神经紊乱看什么科| 掉头发是什么原因| 扑尔敏是什么药| 还有什么寓言故事| 台风什么时候走| 发髻是什么意思| 高压高低压低是什么原因| 独在异乡为异客的异是什么意思| 免疫球蛋白是什么东西| 什么是妈妈臀| 曦是什么意思| 大便弱阳性是什么意思| 孕妇放屁多是什么原因| 什么草药治肿瘤最佳| 海鸥手表属于什么档次| 光动能手表是什么意思| 什么得直什么| 睡不着觉去医院挂什么科| 梦见买馒头是什么意思| 给孩子测骨龄应该挂什么科| 愚钝是什么意思| 记吃不记打的下一句是什么| 雷贝拉唑钠肠溶片什么时候吃| 头发湿着睡觉有什么害处| 口腔扁平苔藓吃什么药好得快| 门庭冷落是什么意思| 多种维生素什么牌子的效果最好| 脂肪垫是什么| 姓名字号是什么意思| 引火归元是什么意思| 化疗后吃什么排毒最快| 重中之重是什么意思| 市辖区是什么意思| 问号是什么意思| 心气虚吃什么药| 心脏早搏是什么意思| 胃息肉有什么症状| 酵母是什么东西| 六字真言是什么意思| 腋毛有什么作用| 壶嘴为什么不能对着人| 什么是黑茶| 歆是什么意思| 武林外传的客栈叫什么| 红糖荷包蛋有什么功效| 碱性磷酸酶偏高说明什么问题| 舀水是什么意思| 河南什么烟出名| 宫外孕什么症状| 2010年属虎的是什么命| 装修属于什么行业| 开塞露擦脸有什么效果| 冬天怕冷夏天怕热是什么原因| 腹胀吃什么药最有效| 1980年属什么| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 活动中心 ? 板卡试用 ? 【LAUNCHXL-F280049C】③eCAP、PWM模块测试及电机测速小试牛

共1条 1/1 1 跳转至

【LAUNCHXL-F280049C】③eCAP、PWM模块测试及电机测速小试牛刀

菜鸟
2025-08-14 23:00:04     打赏
百度 首先给赵继伟点个赞,他的人品确实不差,也给方硕点赞,被这样犯规也能忍住脾气。

【LAUNCHXL-F280049C】②初试driverlib驱动串口-电子产品世界论坛



接上回,体验到TI 基于sysconfig图形化参数设定,以及基于driverlib库函数程序编写方式,感觉TI终于找对了方向(就像ST那样)。


如果有一两句话就能搞定的功能,谁还去研究复杂的寄存器。


本篇进入到TI C2000的核心功能,也就是关于电机控制方向的eCAP及PWM模块。


PWM,顾名思义,脉冲宽度调制,主要用于电机调速。


eCAP,可能稍微陌生一点,(Enhanced Capture)模块是TI C2000系列DSP中极具特色的外设,在应用中扮演着精密时间测量的关键角色。它不仅能实现传统捕获功能,还支持APWM模式,在电机控制、电源管理等领域应用广泛。


本例主要用于精密时间测量,也就是捕获功能。


首先,新建功能,选择ecap_ex2_capture_pwm这个官方例程:

image.png


首先看ecap_ex2_capture_pwm.c程序

在介绍环节介绍得很清楚。

ePWM3A(GPIO4)产生PWM信号————>eCAP1(GPIO16)捕获信号并计时

image.png



我们打开sysconfig图形化设置界面,打开eCAP:

仔细阅读其中设定,主要关注以下

eCAP mode:Capture(捕获)

EVENT1/2/3/4 上升沿、下降沿、上升沿、下降沿捕获。

如eCAP模块介绍:

image.png


image.png



下面得设置很关键:


eCAP input(捕获输入源,最关键参数):GPIO crossbar Signal-7,这是个什么东西?

image.png



crossbar(交叉开关)

可以通过X-BAR将一个外设的输出信号发送给另一个系统外设(例如将ePWM的输出发送给eCAP并进行频率测量的工作)

简单理解就是一个万能导线,可以将任意一个IO连接至任意一个模块,实现了灵活的引脚复用。

如下图所示:

image.png

回到本例:我们看到INPUTXBAR INPUT设定

明确有 INPUT:XBAR_INPUT7(呼应上面的eCAP输入设定)

INPUT Source:GPIO16,这样就将GPIO16作为eCAP输入引脚连接起来。

image.png


回到程序:

main函数就是基本的初始化。

void main(void)
{
    //
    // Initialize device clock and peripherals
    //
    Device_init();

    //
    // Disable pin locks and enable internal pullups.
    //
    Device_initGPIO();

    //
    // Initialize PIE and clear PIE registers. Disables CPU interrupts.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Configure GPIO4/5 as ePWM3A/3B
    //
    GPIO_setPadConfig(4,GPIO_PIN_TYPE_STD);
    GPIO_setPinConfig(GPIO_4_EPWM3_A);
    GPIO_setPadConfig(5,GPIO_PIN_TYPE_STD);
    GPIO_setPinConfig(GPIO_5_EPWM3_B);

    //
    // Board initialization
    // Configure GPIO 16 as eCAP input
    // Enable interrupts required for this example
    //
    Board_init();
    
    //
    // Configure ePWM
    //
    initEPWM();

    //
    // Initialize counters:
    //
    cap2Count = 0U;
    cap3Count = 0U;
    cap4Count = 0U;
    ecap1IntCount = 0U;
    ecap1PassCount = 0U;
    epwm3PeriodCount = 0U;

    //
    // Enable Global Interrupt (INTM) and Real time interrupt (DBGM)
    //
    EINT;
    ERTM;

    //
    // Loop forever. Suspend or place breakpoints to observe the buffers.
    //
    for(;;)
    {
       NOP;
    }
}


initEPWM是PWM的设定函数,本例设定PWM3A(GPIO4为PWM输出引脚)。

//
// initEPWM - Configure ePWM
//
void initEPWM()
{
    //
    // Disable sync(Freeze clock to PWM as well)
    //
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);

    //
    // Configure ePWM
    //       Counter runs in up-count mode.
    //       Action qualifier will toggle output on period match
    //
    EPWM_setTimeBaseCounterMode(EPWM3_BASE, EPWM_COUNTER_MODE_UP);
    EPWM_setTimeBasePeriod(EPWM3_BASE, PWM3_TIMER_MIN);
    EPWM_setPhaseShift(EPWM3_BASE, 0U);
    EPWM_setActionQualifierAction(EPWM3_BASE,
                                  EPWM_AQ_OUTPUT_A,
                                  EPWM_AQ_OUTPUT_TOGGLE,
                                  EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
    EPWM_setClockPrescaler(EPWM3_BASE,
                           EPWM_CLOCK_DIVIDER_1,
                           EPWM_HSCLOCK_DIVIDER_2);

    epwm3TimerDirection = EPWM_TIMER_UP;

    //
    // Enable sync and clock to PWM
    //
    SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TBCLKSYNC);
}


最关键的函数或者功能是INT_myECAP0_ISR 中断函数。


//
// myECAP0 ISR
//
__interrupt void INT_myECAP0_ISR(void)
{
    //
    // Get the capture counts. Each capture should be 2x the ePWM count
    // because of the ePWM clock divider.
    //
    cap2Count = ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_2);
    cap3Count = ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_3);
    cap4Count = ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_4);

    //
    // Compare the period value with the captured count
    //
    epwm3PeriodCount = EPWM_getTimeBasePeriod(EPWM3_BASE);

    if(cap2Count > ((epwm3PeriodCount *2) + 2U) ||
       cap2Count < ((epwm3PeriodCount *2) - 2U))
    {
        error();
    }

    if(cap3Count > ((epwm3PeriodCount *2) + 2U) ||
       cap3Count < ((epwm3PeriodCount *2) - 2U))
    {
        error();
    }

    if(cap4Count > ((epwm3PeriodCount *2) + 2U) ||
       cap4Count < ((epwm3PeriodCount *2) - 2U))
    {
        error();
    }

    ecap1IntCount++;

    //
    // Keep track of the ePWM direction and adjust period accordingly to
    // generate a variable frequency PWM.
    //
    if(epwm3TimerDirection == EPWM_TIMER_UP)
    {
        if(epwm3PeriodCount < PWM3_TIMER_MAX)
        {
           EPWM_setTimeBasePeriod(EPWM3_BASE, ++epwm3PeriodCount);
        }
        else
        {
           epwm3TimerDirection = EPWM_TIMER_DOWN;
           EPWM_setTimeBasePeriod(EPWM3_BASE, ++epwm3PeriodCount);
        }
    }
    else
    {
        if(epwm3PeriodCount > PWM3_TIMER_MIN)
        {
            EPWM_setTimeBasePeriod(EPWM3_BASE, --epwm3PeriodCount);
        }
        else
        {
           epwm3TimerDirection = EPWM_TIMER_UP;
           EPWM_setTimeBasePeriod(EPWM3_BASE, ++epwm3PeriodCount);
        }
    }

    //
    // Count correct captures
    //
    ecap1PassCount++;

    //
    // Clear interrupt flags for more interrupts.
    //
    ECAP_clearInterrupt(myECAP0_BASE,ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
    ECAP_clearGlobalInterrupt(myECAP0_BASE);

    //
    // Start eCAP
    //
    ECAP_reArm(myECAP0_BASE);

    //
    // Acknowledge the group interrupt for more interrupts.
    //
    Interrupt_clearACKGroup(INT_myECAP0_INTERRUPT_ACK_GROUP);
}


通过阅读程序,大概意思应该明白了,首先是对ePWM的脉冲进行捕获CAP2/CAP3/CAP4。


然后将其(*2)跟PWM的周期进行对比。如果异常则进入error。

然后就进行PWM可变周期环节。

根据PWM波形的方向:epwm3TimerDirection 以及他的Count的最大值PWM3_TIMER_MAX、最小值PWM3_TIMER_MIN,通过

EPWM_setTimeBasePeriod(EPWM3_BASE, ++epwm3PeriodCount);

EPWM_setTimeBasePeriod(EPWM3_BASE, --epwm3PeriodCount);

从而动态调制PWM周期。


我们用一根杜邦线将GPIO4与GPIO16连接起来。另外用逻辑分析仪的钩子接在GPIO16实测PWM波形。


41be41ab0ef9534236aa31508c02975.jpg





逻辑分析仪截图如下:

image.png



image.png


image.png



可以看到周期的明显变化。WATCH窗口可以读取精准的测值(cap2就是一个脉冲的持续时长,需要乘以1/100MHZ,算出来大约36us,跟上述逻辑分析仪截图测值相当:52us》注意:不是同一时刻)。



接下来重点介绍本篇的电机测速小试牛刀

这里介绍下我使用的硬件:

淘宝上淘来的编码电机。


电机.jpg



电机输出轴转一圈AB相各输出1152个脉冲。这个很关键。

实际本例只使用A相。

将编码相机的A相接在GPIO16(eCAP输入),同时接逻辑分析仪查看波形。

978753d612e1518122690249db0db1b.jpg

程序在上述官方例程的基础上进行了修改。

加入了波形时间检测:将计数Conut*(1/100MHz)转化为时间.

在根据电机转一圈输出1152个脉冲,计算电机转一圈所需时间。


__interrupt void INT_myECAP0_ISR(void)
{
    //
    // Get the capture counts. Each capture should be 2x the ePWM count
    // because of the ePWM clock divider.
    //
    cap2Count = ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_2);
    cap3Count = ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_3);
    cap4Count = ECAP_getEventTimeStamp(myECAP0_BASE, ECAP_EVENT_4);

    motor_cycle1=cap2Count/100;  //单个编码脉冲时间 单位us 
    motor_cycle2=cap3Count/100;
    motor_cycle3=cap4Count/100;

    motor_cycle = motor_cycle1*2*1152/1000; //电机转一圈时间 单位ms (电机输出轴转一圈输出1152个脉冲)


    
    epwm3PeriodCount = EPWM_getTimeBasePeriod(EPWM3_BASE);

    

    ecap1IntCount++;

    //
    // Keep track of the ePWM direction and adjust period accordingly to
    // generate a variable frequency PWM.
    //
    
    //
    // Count correct captures
    //
    ecap1PassCount++;

    //
    // Clear interrupt flags for more interrupts.
    //
    ECAP_clearInterrupt(myECAP0_BASE,ECAP_ISR_SOURCE_CAPTURE_EVENT_4);
    ECAP_clearGlobalInterrupt(myECAP0_BASE);

    //
    // Start eCAP
    //
    ECAP_reArm(myECAP0_BASE);

    //
    // Acknowledge the group interrupt for more interrupts.
    //
    Interrupt_clearACKGroup(INT_myECAP0_INTERRUPT_ACK_GROUP);
}


运行如下:

image.png

也就是电机转一圈2.1秒,跟我用秒表计时几乎一样,实验成功。

再用逻辑分析仪检测下波形。脉冲时间893us,跟上图的motor_cycle1完全一致。

image.png

测试成功!


电机测速.gif





关键词: C2000    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
卡路里是什么意思 什么思而行 利有攸往是什么意思 扁平疣是什么原因引起的 心疼是什么原因
氨曲南是什么药 排卵期是什么意思 突然手发抖是什么原因 病魔是什么意思 虚荣心是什么意思
吃什么下火效果最好 脸上长水泡似的痘痘是什么原因 胃痉挛什么症状 暖巢早衰是什么原因 眼睛充血用什么药
路征和景甜什么关系 孽障是什么意思 落枕吃什么药 泮池是什么意思 mn是什么单位
脑梗需要注意什么hcv9jop3ns3r.cn 宝宝反复发烧是什么原因引起的1949doufunao.com 港式按摩是什么意思hcv8jop1ns7r.cn 胸闷气短挂什么科室onlinewuye.com 血压低是什么原因造成的hcv9jop0ns9r.cn
什么东西有脚却不能走路hcv8jop9ns6r.cn 肚子左下方是什么器官hcv7jop9ns3r.cn 5月27日什么星座hcv9jop5ns3r.cn 感冒吃什么饭菜比较好hcv9jop6ns9r.cn 前囟门什么时候闭合hcv8jop9ns9r.cn
死了妻子的男人叫什么hcv9jop4ns0r.cn 生长发育挂什么科gangsutong.com 痰湿瘀阻是什么症状hcv8jop1ns7r.cn 花五行属什么hcv9jop1ns8r.cn oct是什么意思hcv9jop7ns2r.cn
spandex是什么面料hcv9jop2ns2r.cn 莱特兄弟发明了什么hcv8jop4ns5r.cn 机智如你是什么意思hcv9jop0ns7r.cn 儿保做些什么检查项目hcv8jop8ns1r.cn 什么蘑菇有毒hcv7jop6ns4r.cn
百度