重工电子论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz

飞思卡尔使用例程

查看数: 5845 | 评论数: 5 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-2-21 23:18

正文摘要:

本帖最后由 李维强-15级 于 2017-2-26 14:37 编辑 例程全部基于超核库函数,直接调用 按键扫描 4*4 开启PWM例程 外部中断,配合编码器使用

回复

刘洋电子刘洋 发表于 2017-3-4 19:21:30
电机驱动原理图以及PCB图以设计好,测试可用,大家可以下载学习使用。


以下为工程附件,下载即可。
电机驱动.zip (2.89 MB, 下载次数: 11)
鲁亮 发表于 2017-2-28 12:44:31
顶一个
李维强-15级 发表于 2017-2-25 21:54:29
本帖最后由 李维强-15级 于 2017-2-25 21:55 编辑

按键设置为按下再弹起后,再去做按键的操作,保证按一次响应一次
初始化PWM直接调用下面这一句话即可。

  1. FTM_PWM_QuickInit(FTM0_CH0_PC01, kPWM_EdgeAligned, 1000);
复制代码

其中    FTM0_CH0_PC01代表使用FTM0定时器,且开启CH0通道,对应端口为PC01,kPWM_EdgeAligned表示使用边沿触发,1000表示频率为1000Hz

改变占空比用下面这一句话

  1. FTM_PWM_ChangeDuty(HW_FTM0, HW_FTM_CH0, 0);
  2. /* 第三个参数取值0-10000,对应占空比 0-100% ,第二个参数HW_FTM_CH0表示通道改变通道0的占空比,第一个参数HW_FTM0表示对FTM0定时器进行设置*/
复制代码


注意 我知己封装了个函数 在主函数下面

  1. //表示
  2. void PWMEnable(uint32_t MAP,FunctionalState STATE)
  3. {
  4.     static FTM_Type * const FTM_InstanceTable[] = FTM_BASES;
  5.     map_t * pq = (map_t*)&(MAP);               
  6.     if(STATE==DISABLE)
  7.     {
  8.         FTM_InstanceTable[pq->ip]->CONTROLS[pq->chl].CnSC &=0xF3;      
  9.     }
  10.     else
  11.     {
  12.         FTM_InstanceTable[pq->ip]->CONTROLS[pq->chl].CnSC &=~(FTM_CnSC_ELSB_MASK|FTM_CnSC_ELSA_MASK);
  13.         FTM_InstanceTable[pq->ip]->CONTROLS[pq->chl].CnSC |=FTM_CnSC_ELSB_MASK;
  14.     }

  15. }


  16. //                    PWMEnable(FTM0_CH0_PC01,ENABLE);  //开启FTM0的PWM通道0
  17. //                    PWMEnable(FTM0_CH0_PC01,DISABLE);  //关闭FTM0的PWM通道0
复制代码



下面这个视频视直接截取的电机引脚上的
http://v.cqutbbs.cn/upload/video/20170225/QQ%E7%9F%AD%E8%A7%86%E9%A2%9120170225214539.mp4

开两路PWM并且按键控制占空比.rar (2.26 MB, 下载次数: 1)
李维强-15级 发表于 2017-2-21 23:29:56
本帖最后由 李维强-15级 于 2017-2-22 02:58 编辑

按键扫描
4*4键盘 没有任何外接的那种键盘

h头文件
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#ifndef __MATRIX_KEY_H
#define __MATRIX_KEY_H		
#include "common.h"	 

//默认配置到E口0-7脚,如需要自己修改
#define MatrixPin1_1  0x0u
#define MatrixPin1_2  0x2u
#define MatrixPin1_3  0x4u
#define MatrixPin1_4  0x6u
#define MatrixPin2_1  0x1u
#define MatrixPin2_2  0x3u
#define MatrixPin2_3  0x5u
#define MatrixPin2_4  0x7u

void matrix_key_init(void);//初始化矩阵键盘
void Matrix_key_Init_1(void);		
void Matrix_key_Init_2(void);
uint8_t MatrixKeyScan(void);	//扫描

#endif
}


.C源文件
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#include "MatrixKey.h"
#include "common.h"
#include "gpio.h"

/*
author@李维强
适合周老师发的黑色开发板,4*4键盘,E0,E2,E4,E6端口接一排,E1,E3,E5,E7端口接一排
该代码看起简单,但是有大量重复调用流程,追求效率的同学慎用!!!
*/
void matrix_key_init(void)          
{
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_OPP);
	
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_IPD);	
}

void Matrix_key_Init_1(void)
{
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_OPP);

    GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_IPD);	  	
}

void Matrix_key_Init_2(void)
{
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_1,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_2,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_3,kGPIO_Mode_OPP);
    GPIO_QuickInit(HW_GPIOE,MatrixPin2_4,kGPIO_Mode_OPP);

    GPIO_QuickInit(HW_GPIOE,MatrixPin1_1,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_2,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_3,kGPIO_Mode_IPD);
    GPIO_QuickInit(HW_GPIOE,MatrixPin1_4,kGPIO_Mode_IPD);	        
}

uint8_t MatrixKeyScan(void)
{
    uint8_t key=0;
    Matrix_key_Init_1();
    DelayUs(1);
    PEout(MatrixPin1_1)=1;PEout(MatrixPin1_2)=1;PEout(MatrixPin1_3)=1;PEout(MatrixPin1_4)=1;
    DelayUs(1);
	if(PEin(MatrixPin2_1)==1 || PEin(MatrixPin2_2)==1 || PEin(MatrixPin2_3)==1 || PEin(MatrixPin2_4)==1)
    {
        DelayMs(10);
        if(PEin(MatrixPin2_1)==1){key=1;}
        else if(PEin(MatrixPin2_2)==1){key=2;}	
        else if(PEin(MatrixPin2_3)==1){key=3;}	
        else if(PEin(MatrixPin2_4)==1){key=4;}	        
        
        Matrix_key_Init_2();
        DelayMs(10);
        PEout(MatrixPin2_1)=1;PEout(MatrixPin2_2)=1;PEout(MatrixPin2_3)=1;PEout(MatrixPin2_4)=1;
        DelayUs(1);
        if(PEin(MatrixPin1_1)==1){key+=0;}
        else if(PEin(MatrixPin1_2)==1){key+=4;}	
        else if(PEin(MatrixPin1_3)==1){key+=8;}	
        else if(PEin(MatrixPin1_4)==1){key+=12;}
        else{key=0;}               
    }        
    return key;
}




调用流程
包含头文件后在主循环里面调用:

  1. temp_key=MatrixKeyScan();
复制代码

然后temp_key这个变量就会有你按下的那个按键的值(1-16之间),如果都没按下 temp_key为0。

Archiver|手机版|小黑屋|cqutlab ( 渝ICP备15004556号

GMT+8, 2024-5-20 05:11 , Processed in 0.146226 second(s), 33 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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