查看: 3237|回复: 1

【MC56F83xxx数字信号控制器开发板试用】+PWM例程调试之小误解

[复制链接]
  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
    发表于 2020-11-11 09:11:27 | 显示全部楼层 |阅读模式
    本帖最后由 胤幻1988 于 2020-11-11 09:11 编辑

    今天调试MC56F83789开发板时,直接加载了官方的程序,NXP在这方面考虑的很全面,有PWM_FAULT引脚,这样通过外部硬件的状态就能结束PWM,
    这样对于一些驱动电机什么的一旦出现故障只要按下按钮就能停止了,一般用软件关联一个按键中断做,但NXP直接就定义成了IO配置的一种功能,直接在硬件上就控制了,还是挺好的。
    导入56F83789_EVK_PWMA_trigger_ADC这个例子,这个例子不知道是我IDE环境路径配置的问题,还是啥的死活打不开算法头文件"mlib.h",在工程里面强行添加路径,也没用。后来没办法直接定义具体的相对路径了。编译无错,下载。例程的readme提示说:
    a1.png
    开启3个PWM通道,其中每个通道又有互补的2路,共6路控制了6个LED。
    SW2-->产生一个错误,然后PWM就保护了,清零关断了。按下PWM控制的LED会全部熄灭。
    SW3-->清除错误,并重新启动PWM、按下,PWM控制的灯恢复打开状态。
    SW4-->PWM占空比12.5%增加。
    SW5-->PWM占空比12.5%减少。
    观看现象,确实如readme所说,但是观察程序时,我们这里直接先看mian函数里面的按键控制相关:
    1. if(sSW3.check_button(&sSW3))
    2.                 {
    3.                         // Clear fault0 flag if SW3 is pressed. This is to enable PWM output again in safe mode
    4.                         PWMA->FSTS0 |= PWM_FSTS0_FFLAG(0x1);
    5.                 }
    6.                 if(sSW4.check_button(&sSW4))
    7.                 {
    8.                         // Increase duty of SM0~SM2
    9.                         f16Duty = MLIB_AddSat_F16(f16Duty,FRAC16(0.125));
    10.                 }
    11.                 if(sSW5.check_button(&sSW5))
    12.                 {
    13.                         // Decrease duty of SM0~SM2
    14.                         f16Duty = MLIB_SubSat_F16(f16Duty,FRAC16(0.125));
    15.                         if(f16Duty <= 0)
    16.                         {
    17.                                 f16Duty = 0;
    18.                         }
    19.                 }
    复制代码
    发现仅对SW3,SW4,SW5进行了控制,那么SW2的控制在哪呢?我立马去看GPIO的配置:
    1. void pin_init(void)
    2. {
    3.         // LED red off
    4.         GPIOF->PER &= ~GPIO_PER_PE(MASK_BIT8);  // Set to GPIO mode
    5.         GPIOF->DDR |= GPIO_DDR_DD(MASK_BIT8);   // Set to output mode
    6.         GPIOF->DR |= GPIO_DR_D(MASK_BIT8);     // Output 0
    7.         // LED green off
    8.         GPIOF->PER &= ~GPIO_PER_PE(MASK_BIT9);  // Set to GPIO mode
    9.         GPIOF->DDR |= GPIO_DDR_DD(MASK_BIT9);   // Set to output mode
    10.         GPIOF->DR |= GPIO_DR_D(MASK_BIT9);     // Output 0
    11.         // LED blue off
    12.         GPIOF->PER &= ~GPIO_PER_PE(MASK_BIT10);  // Set to GPIO mode
    13.         GPIOF->DDR |= GPIO_DDR_DD(MASK_BIT10);   // Set to output mode
    14.         GPIOF->DR |= GPIO_DR_D(MASK_BIT10);     // Output 0
    15.         // LED yellow off
    16.         GPIOF->PER &= ~GPIO_PER_PE(MASK_BIT11);  // Set to GPIO mode
    17.         GPIOF->DDR |= GPIO_DDR_DD(MASK_BIT11);   // Set to output mode
    18.         GPIOF->DR |= GPIO_DR_D(MASK_BIT11);     // Output 0
    19.         // PWMA LEDs - PWMA outputs
    20.         GPIOE->PER |= (MASK_BIT0|MASK_BIT1|MASK_BIT2|MASK_BIT3|MASK_BIT4|MASK_BIT5); // Set to PWM outputs

    21.         // Configure SCI0 pins
    22.         GPIOC->PER |= GPIO_PER_PE(MASK_BIT2); // Set to peripheral mode
    23.         GPIOC->PER |= GPIO_PER_PE(MASK_BIT3); // Set to peripheral mode
    24.         SIM->GPSCL = (SIM->GPSCL & ~SIM_GPSCL_C2_MASK)|SIM_GPSCL_C2(0); // Set as RXD0
    25.         SIM->GPSCL = (SIM->GPSCL & ~SIM_GPSCL_C3_MASK)|SIM_GPSCL_C3(2); // Set as TXD0
    26.        
    27. <font color="#ff0000">        // PWMA fault input
    28.         GPIOF->PER |= MASK_BIT15; // F15 is set to peripheral
    29.         SIM->GPSFH |= SIM_GPSFH_F15_MASK; // F15 is set as XB_IN10</font>
    30.        
    31.         // ADC inputs
    32.         GPIOA->PER |= MASK_BIT6|MASK_BIT7;
    33.         GPIOB->PER |= MASK_BIT7;
    34.        
    35.         // Button inputs
    36. <font color="#ff0000">        //SW2-->PC4
    37.         //SW3-->PF1
    38.         //SW4-->PF6
    39.         GPIOC->PER &= ~MASK_BIT4;
    40.         GPIOF->PER &= ~(MASK_BIT1|MASK_BIT6);
    41.         GPIOC->DDR &= ~MASK_BIT4;
    42.         GPIOF->DDR &= ~(MASK_BIT1|MASK_BIT6);</font>
    43. }
    复制代码
    找到红色标志的代码,看出F15配置成了PWM_FAULT输入了,PC4,PF1,PF6配置成了普通的按键。
    main函数里面又只调用了SW3,SW4,SW5,按照这个逻辑F15应该对应SW2了?
    查看原理图:
    K1.png
    K2.png
    实际上:
    SW2-->C4
    SW3-->F1
    SW4-->F6
    SW5-->F15
    显然与由程序推理出的按键号不符合,什么鬼:
    再main函数里面按键的初始化代码中:
    1. sSW3.sStatus = NOT_PRESSED;
    2.   sSW3.readButtonVal = readSW3Button;
    3.   sSW3.check_button = is_button_pressed;
    4.   sSW3.debounce = button_process;
    5.   sSW4.sStatus = NOT_PRESSED;
    6.   sSW4.readButtonVal = readSW4Button;
    7.   sSW4.check_button = is_button_pressed;
    8.   sSW4.debounce = button_process;
    9.   sSW5.sStatus = NOT_PRESSED;
    10.   sSW5.readButtonVal =<font color="#ff0000"> readSW5Button</font>;
    11.   sSW5.check_button = is_button_pressed;
    12.   sSW5.debounce = button_process;  
    复制代码
    我们跟踪下标注的红色代码:
    1. uint16_t readSW2Button(BUTTON_CTRL_TYPE *ptr)
    2. {
    3.         return (GPIOF->DR & MASK_BIT15);
    4. }
    5. uint16_t readSW3Button(BUTTON_CTRL_TYPE *ptr)
    6. {
    7.         return (GPIOF->DR & MASK_BIT1);
    8. }
    9. uint16_t readSW4Button(BUTTON_CTRL_TYPE *ptr)
    10. {
    11.         return (GPIOF->DR & MASK_BIT6);
    12. }
    13. uint16_t readSW5Button(BUTTON_CTRL_TYPE *ptr)
    14. {
    15.         return (GPIOC->DR & MASK_BIT4);
    16. }
    复制代码
    这才真相大白:
    它程序中的按键标号SWX与实际的并不对应:
    程序中:                                  电路中:
    SW2-->F15                              SW5-->F15
    SW3-->F1                                SW3-->F1
    SW4-->F6                                SW4-->F6
    SW5-->C4                                SW2-->C4
    真是蛋疼,就这小小的按键定义的号,还误导了我一次。
    PWM波形很不错,还经过74LV04增强了驱动能力:
    微信图片_20201111091040.jpg
    关于PWM的具体配置,我们下面再说。





    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-11-4 13:30
  • 签到天数: 47 天

    [LV.5]常住居民I

    3

    主题

    167

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    379
    最后登录
    2024-4-16
    发表于 2020-11-11 11:33:51 | 显示全部楼层
    感谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 21:32 , Processed in 0.116662 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表