儿童缺铁吃什么补得快| 人为什么会打哈欠| 女生胸疼是什么原因| 18是什么意思| 痔疮吃什么药好| 要强的女人是什么性格| 恋物癖是什么| 正常高压是什么意思| 薏米和什么一起煮粥最好| 锅包肉是什么肉| 甲亢能吃什么| 脾胃不好吃什么药| 马蜂泡酒有什么功效| 处暑是什么季节| 孕妇适合喝什么茶| 甲鱼和什么食物相克| 睡不着觉吃什么药| 肺气肿是什么意思| 梦见什么是怀孕的征兆| 九月三号是什么日子| 峦读什么| 经期同房需要注意什么| 自卑是什么意思| 什么是富贵包| 鱼泡是什么| 梦见兔子是什么预兆| 高挑是什么意思| 乔迁送什么花| 外痔长什么样| 祖先是什么意思| 腰疼吃什么药好| 什么是佛| 海鸥吃什么| 孕妇鼻子出血是什么原因| 血小板分布宽度偏高是什么意思| 质子治疗是什么意思| 孩子胃疼吃什么药| 空调买什么牌子好| 振水音阳性提示什么| 小猫呕吐吃什么药| 嗓子干痒是什么原因| 舌苔发白是什么病的前兆| 铁观音茶属于什么茶| 脚痛什么原因引起的| 黄体酮吃多了有什么副作用| 酵素什么牌子好| 豆蔻是什么| 股票的量比是什么意思| 滞留针是什么| 靖国神社是什么| 曩是什么意思| 男性补肾壮阳吃什么药效果比较好| 挑拨离间是什么意思| 蜂王浆有什么好处| 什么一气| 经常掉头发是什么原因| 区委副书记是什么级别| 朱元璋为什么不传位给朱棣| 为什么白带是褐色的| 人言轻微是什么意思| 水浒传主要讲了什么| 喝什么解酒最快最有效| 男生手淫有什么危害| 黑豚肉是什么肉| 嗤之以鼻是什么意思| 下巴有痣代表什么| 女人吃什么补气血| 感冒低烧吃什么药| 男性吃什么生精快| 什么是螨虫型痘痘图片| 手臂痛什么原因| 血沉高意味着什么意思| 双甘油脂肪酸酯是什么| 自汗吃什么中成药| 胸痛应该挂什么科| 办身份证要带什么| 易举易泄是什么原因| 拔智齿挂什么科| 早饱是什么意思| 优雅知性是什么意思| 瘢痕子宫什么意思| 五月十五是什么星座| 人为什么要生孩子| 聚焦是什么意思| 鼻窦炎首选什么抗生素| 空腹喝啤酒有什么危害| 湿疹是什么引起的| 甲减不能吃什么东西| 三冬是什么意思| 检查乳腺做什么检查| 尿液发绿是什么原因| 一切尽在不言中什么意思| 三七甘一是什么意思| 熠字五行属什么| 老是打饱嗝是什么原因| 番茄红素有什么作用| 流鼻涕是什么原因| 玻尿酸面膜有什么功效| 牙疼能吃什么食物| 蒜薹和蒜苔有什么区别| 解绑是什么意思| 说话不清楚是什么原因导致的| 74年属什么生肖| 十月二十三号是什么星座| 猎头是干什么的| 桃子像什么| 鼻子上的痣有什么寓意| 样本是什么意思| 小脑延髓池是什么意思| 男人阴虱用什么药| 电解质饮料有什么作用| 梦见黑蛇是什么意思| 尿道炎有什么症状| 不什么不什么的四字词语| 应无所住什么意思| 光年是什么单位| 晚字五行属什么| 痤疮是什么东西| 什么的小朋友填词语| 指甲竖纹是什么原因| 沙漠玫瑰什么时候开花| 什么卫什么海| 长鸡眼是什么原因| 斑点狗是什么品种| 拍胸片挂什么科室| 什么叫真爱| 又什么又什么的葡萄| 生肖蛇和什么生肖相冲| 白猫进家有什么预兆| 睡觉爱做梦是什么原因| 18年属什么| MS医学上是什么意思| 刚愎自用是什么意思| 7代表什么意思| 牙发黑是什么原因怎么办| 血肿不治疗有什么后果| 鸟屎掉衣服上有什么预兆| 心脏房颤是什么症状| 全麦面包是什么意思| 血小板减少吃什么| 甘油三酯高应该注意什么| 于文华朱之文什么关系| 领结婚证需要带什么材料| pnh是什么病| 书生是什么意思| 血小板降低是什么病| icd医学上是什么意思| 张家界地貌属于什么地貌| 膝盖骨质增生用什么药效果好| 水疗是什么| 猫的偏旁叫什么| lu是什么单位| 小孩肚子疼拉肚子吃什么药| 猫能吃什么| 荞麦茶有什么功效| 亚瑟士和鬼冢虎的区别是什么| diss是什么意思| 副处长是什么级别| 人生八苦是什么| 四月八日是什么星座| olayks是什么牌子| 腘窝囊肿挂什么科| 被是什么偏旁怎么读| 1979年属什么生肖| 大器晚成什么意思| 营养心脏最好的药是什么药| 背痛去医院挂什么科| 来大姨妈不能吃什么| 尿多尿频是什么原因| 左手臂有痣代表什么| 宫腔积液和盆腔积液有什么区别| vaude是什么品牌| 碍事是什么意思| 脚干裂用什么药膏| 卧轨是什么意思| 什么是抗生素类药物| 创伤性湿肺是什么意思| 酒后大量出虚汗什么原因| 诺如病毒感染吃什么药| 猪头猪脑是什么生肖| 女儿的女儿叫什么| cpc是什么意思啊| 自理是什么意思| 泌尿内科主要看什么病| 那好吧是什么意思| 推特是什么意思| 盗汗吃什么药效果最快| 追忆是什么意思| 孕妇拉肚子是什么原因引起的| 亓是什么意思| 吉祥三宝是什么意思| 脑梗前有什么预兆| ppm是什么意思| 恩赐是什么意思| 睾丸变小是什么原因| 什么食物含钾多| 吃洋葱对身体有什么好处| 西安五行属什么| 肚子疼吃什么食物好| 给你脸了是什么意思| 偏头痛吃什么药效果好| 大禹姓什么| 掉头发什么原因| 氯雷他定片是治什么的| 布朗是什么水果| 预谋是什么意思| 菊花泡茶有什么功效| 咖啡烘培度有什么区别| deep是什么意思| 良民是什么意思| 背靠背协议是什么意思| 山峰是什么意思| 尿道炎吃什么药好| 看望老人买什么礼物好| 玻璃是什么做的| 耳鸣是什么原因引起的嗡嗡的响| 摩羯座是什么星象| 卵巢炎症有什么症状| 水蚤吃什么| 怀孕前期有什么症状| 梅花表属于什么档次| 黄花菜都凉了是什么意思| 荷尔蒙是什么意思啊| 三五成群是什么生肖| 亚蒂息肉是什么意思| 梵天是什么意思| 非分之想什么意思| ckd医学上是什么意思| 胎动什么感觉| 老是头晕是什么原因| 多普勒超声检查是什么| 什么叫潮吹| 什么可以解酒最快方法| 什么是闰年什么是平年| 蒂芙尼属于什么档次| 钾高了会出现什么症状| 梨子煮水喝有什么功效| 1.4什么星座| 豌豆淀粉可以做什么| 丙酮是什么| 风雨雷电代表什么生肖| 夏枯草有什么作用| hbr是什么意思| 秋分是什么意思| 头晕耳鸣是什么原因引起的| 话少一般都是什么人| 作数是什么意思| 牛肉饺子馅配什么蔬菜| 大雄宝殿供奉的是什么佛| 什么是甲减有什么症状| 浮水是什么意思| 缓刑是什么意思| 子宫憩室是什么| 血糖偏高吃什么水果好| 嘴巴旁边长痘痘是为什么| 立夏什么时候| at什么意思| 女生发个wink什么意思| 荸荠又叫什么| 吸血鬼怕什么| 海蓝之谜适合什么肤质| 硬化症是什么病| 睡觉磨牙是什么情况| 边缘视力是什么意思| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 活动中心 ? 板卡试用 ? 【LAUNCHXL-F280049C】③eCAP、PWM模块测试及电机测速小试牛

共1条 1/1 1 跳转至

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

菜鸟
2025-08-04 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 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
安乐死是什么意思 2005属什么生肖 太阳穴疼是什么原因 刘备是什么样的人 6月14号什么星座
hpv挂什么科 什么姓氏好听 一什么书桌 嘴唇薄的男人面相代表什么意味 木指什么生肖
不可亵玩焉的亵是什么意思 老年人贫血吃什么补血最快最有效 美人鱼2什么时候上映 国债什么意思 麻雀吃什么
为什么腰会痛 养囊是什么意思 婴儿什么时候开始认人 bv是什么意思 无什么不什么的成语
最后一个出场叫什么hcv8jop0ns3r.cn 暇步士是什么档次品牌hcv7jop4ns8r.cn 健康四大基石是什么hcv9jop4ns5r.cn 皇帝菜是什么菜hcv8jop0ns3r.cn 什么大笑hcv7jop9ns4r.cn
大姨妈来了吃什么aiwuzhiyu.com 胚芽米是什么米hcv7jop5ns2r.cn 什么颜色加什么颜色是黄色hcv8jop7ns7r.cn 魈是什么意思shenchushe.com 核磁共振跟ct有什么区别hcv9jop2ns5r.cn
义举是什么意思hkuteam.com 喝什么有助于睡眠hcv9jop6ns7r.cn 不问世事什么意思hcv8jop3ns8r.cn 骨化是什么意思hcv9jop6ns3r.cn 怀疑肝不好挂什么科室hcv8jop0ns3r.cn
硬化症是什么病bjcbxg.com 乳酸菌和益生菌有什么区别hlguo.com 腊月初八是什么星座inbungee.com 药占比什么意思hcv8jop6ns8r.cn 茶歇是什么意思hcv8jop9ns9r.cn
百度