在线时间372 小时
UID3135871
注册时间2016-10-9
NXP金币20
TA的每日心情 | 怒 2024-2-5 12:06 |
---|
签到天数: 627 天 [LV.9]以坛为家II
版主
- 积分
- 4429
- 最后登录
- 2024-2-5
|
本帖最后由 胤幻1988 于 2020-11-11 09:11 编辑
今天调试MC56F83789开发板时,直接加载了官方的程序,NXP在这方面考虑的很全面,有PWM_FAULT引脚,这样通过外部硬件的状态就能结束PWM,
这样对于一些驱动电机什么的一旦出现故障只要按下按钮就能停止了,一般用软件关联一个按键中断做,但NXP直接就定义成了IO配置的一种功能,直接在硬件上就控制了,还是挺好的。
导入56F83789_EVK_PWMA_trigger_ADC这个例子,这个例子不知道是我IDE环境路径配置的问题,还是啥的死活打不开算法头文件"mlib.h",在工程里面强行添加路径,也没用。后来没办法直接定义具体的相对路径了。编译无错,下载。例程的readme提示说:
开启3个PWM通道,其中每个通道又有互补的2路,共6路控制了6个LED。
SW2-->产生一个错误,然后PWM就保护了,清零关断了。按下PWM控制的LED会全部熄灭。
SW3-->清除错误,并重新启动PWM、按下,PWM控制的灯恢复打开状态。
SW4-->PWM占空比12.5%增加。
SW5-->PWM占空比12.5%减少。
观看现象,确实如readme所说,但是观察程序时,我们这里直接先看mian函数里面的按键控制相关:
- if(sSW3.check_button(&sSW3))
- {
- // Clear fault0 flag if SW3 is pressed. This is to enable PWM output again in safe mode
- PWMA->FSTS0 |= PWM_FSTS0_FFLAG(0x1);
- }
- if(sSW4.check_button(&sSW4))
- {
- // Increase duty of SM0~SM2
- f16Duty = MLIB_AddSat_F16(f16Duty,FRAC16(0.125));
- }
- if(sSW5.check_button(&sSW5))
- {
- // Decrease duty of SM0~SM2
- f16Duty = MLIB_SubSat_F16(f16Duty,FRAC16(0.125));
- if(f16Duty <= 0)
- {
- f16Duty = 0;
- }
- }
复制代码 发现仅对SW3,SW4,SW5进行了控制,那么SW2的控制在哪呢?我立马去看GPIO的配置:
- void pin_init(void)
- {
- // LED red off
- GPIOF->PER &= ~GPIO_PER_PE(MASK_BIT8); // Set to GPIO mode
- GPIOF->DDR |= GPIO_DDR_DD(MASK_BIT8); // Set to output mode
- GPIOF->DR |= GPIO_DR_D(MASK_BIT8); // Output 0
- // LED green off
- GPIOF->PER &= ~GPIO_PER_PE(MASK_BIT9); // Set to GPIO mode
- GPIOF->DDR |= GPIO_DDR_DD(MASK_BIT9); // Set to output mode
- GPIOF->DR |= GPIO_DR_D(MASK_BIT9); // Output 0
- // LED blue off
- GPIOF->PER &= ~GPIO_PER_PE(MASK_BIT10); // Set to GPIO mode
- GPIOF->DDR |= GPIO_DDR_DD(MASK_BIT10); // Set to output mode
- GPIOF->DR |= GPIO_DR_D(MASK_BIT10); // Output 0
- // LED yellow off
- GPIOF->PER &= ~GPIO_PER_PE(MASK_BIT11); // Set to GPIO mode
- GPIOF->DDR |= GPIO_DDR_DD(MASK_BIT11); // Set to output mode
- GPIOF->DR |= GPIO_DR_D(MASK_BIT11); // Output 0
- // PWMA LEDs - PWMA outputs
- GPIOE->PER |= (MASK_BIT0|MASK_BIT1|MASK_BIT2|MASK_BIT3|MASK_BIT4|MASK_BIT5); // Set to PWM outputs
- // Configure SCI0 pins
- GPIOC->PER |= GPIO_PER_PE(MASK_BIT2); // Set to peripheral mode
- GPIOC->PER |= GPIO_PER_PE(MASK_BIT3); // Set to peripheral mode
- SIM->GPSCL = (SIM->GPSCL & ~SIM_GPSCL_C2_MASK)|SIM_GPSCL_C2(0); // Set as RXD0
- SIM->GPSCL = (SIM->GPSCL & ~SIM_GPSCL_C3_MASK)|SIM_GPSCL_C3(2); // Set as TXD0
-
- <font color="#ff0000"> // PWMA fault input
- GPIOF->PER |= MASK_BIT15; // F15 is set to peripheral
- SIM->GPSFH |= SIM_GPSFH_F15_MASK; // F15 is set as XB_IN10</font>
-
- // ADC inputs
- GPIOA->PER |= MASK_BIT6|MASK_BIT7;
- GPIOB->PER |= MASK_BIT7;
-
- // Button inputs
- <font color="#ff0000"> //SW2-->PC4
- //SW3-->PF1
- //SW4-->PF6
- GPIOC->PER &= ~MASK_BIT4;
- GPIOF->PER &= ~(MASK_BIT1|MASK_BIT6);
- GPIOC->DDR &= ~MASK_BIT4;
- GPIOF->DDR &= ~(MASK_BIT1|MASK_BIT6);</font>
- }
复制代码 找到红色标志的代码,看出F15配置成了PWM_FAULT输入了,PC4,PF1,PF6配置成了普通的按键。
main函数里面又只调用了SW3,SW4,SW5,按照这个逻辑F15应该对应SW2了?
查看原理图:
实际上:
SW2-->C4
SW3-->F1
SW4-->F6
SW5-->F15
显然与由程序推理出的按键号不符合,什么鬼:
再main函数里面按键的初始化代码中:
- sSW3.sStatus = NOT_PRESSED;
- sSW3.readButtonVal = readSW3Button;
- sSW3.check_button = is_button_pressed;
- sSW3.debounce = button_process;
- sSW4.sStatus = NOT_PRESSED;
- sSW4.readButtonVal = readSW4Button;
- sSW4.check_button = is_button_pressed;
- sSW4.debounce = button_process;
- sSW5.sStatus = NOT_PRESSED;
- sSW5.readButtonVal =<font color="#ff0000"> readSW5Button</font>;
- sSW5.check_button = is_button_pressed;
- sSW5.debounce = button_process;
复制代码 我们跟踪下标注的红色代码:
- uint16_t readSW2Button(BUTTON_CTRL_TYPE *ptr)
- {
- return (GPIOF->DR & MASK_BIT15);
- }
- uint16_t readSW3Button(BUTTON_CTRL_TYPE *ptr)
- {
- return (GPIOF->DR & MASK_BIT1);
- }
- uint16_t readSW4Button(BUTTON_CTRL_TYPE *ptr)
- {
- return (GPIOF->DR & MASK_BIT6);
- }
- uint16_t readSW5Button(BUTTON_CTRL_TYPE *ptr)
- {
- return (GPIOC->DR & MASK_BIT4);
- }
复制代码 这才真相大白:
它程序中的按键标号SWX与实际的并不对应:
程序中: 电路中:
SW2-->F15 SW5-->F15
SW3-->F1 SW3-->F1
SW4-->F6 SW4-->F6
SW5-->C4 SW2-->C4
真是蛋疼,就这小小的按键定义的号,还误导了我一次。
PWM波形很不错,还经过74LV04增强了驱动能力:
关于PWM的具体配置,我们下面再说。
|
|