精华内容
下载资源
问答
  • 1 i.MX RT1064 Introduction The i.MX RT1064 is a new processor family featuring NXP’s advanced implementation of the Arm Cortex®-M7 core, which operates at speeds up to 600 MHz to provide high CPU ...
  • 基于RT1064的电磁巡线小车

    千次阅读 多人点赞 2020-10-29 21:46:41
    基于RT1064的电磁巡线小车 文章目录一、原理图二、使用步骤1.初始化参数2.中断函数3.代码整体总结新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片...

    基于RT1064的电磁巡线小车


    本文章是基于RT1064让智能小车实现电磁巡线。


    提示:以下是本篇文章正文内容,下面案例可供参考

    使用步骤

    1.初始化参数

    代码如下(示例):

        DisableGlobalIRQ();
        board_init();
          //电机初始化
          //右轮转动方向设置
          gpio_init(D12, GPO, 0, GPIO_PIN_CONFIG);
          gpio_init(D13, GPO, 0, GPIO_PIN_CONFIG);
          //左轮转动方向设置
          gpio_init(D14, GPO, 0, GPIO_PIN_CONFIG);
          gpio_init(D15, GPO, 0, GPIO_PIN_CONFIG);
         //初始化电机PWN
          pwm_init(PWM1_MODULE3_CHB_D1, 1000, 10000);
          pwm_init(PWM1_MODULE3_CHA_D0, 1000, 10000);
          
          //舵机初始化
          pwm_init(PWM4_MODULE2_CHA_C30, 50, 800); 
          
          //初始化ADC模块
          adc_init(ADC_1,ADC1_CH4_B15,ADC_8BIT);
          adc_init(ADC_1,ADC1_CH3_B14,ADC_8BIT);
          
          //中断初始化
          pit_init();
          pit_interrupt_ms(PIT_CH1, 10);
          
        EnableGlobalIRQ(0);
    

    2.中断函数

    代码如下(示例):

          //AD采集
          for(int i=0;i<10;i++)
          {
            adcnumber_right_value[i]=adc_convert(ADC_1,ADC1_CH4_B15);
            adcnumber_left_value[i]=adc_convert(ADC_1,ADC1_CH3_B14);
          }      
          adcnumber_right=(adcnumber_right_value[4]+adcnumber_right_value[5])/2;
          adcnumber_left=(adcnumber_left_value[4]+adcnumber_left_value[5])/2;
          
          //越界判断
          if(adcnumber_right>10&&adcnumber_left>10)
          {
            gpio_set(D12, 0);
            gpio_set(D13, 1);
            gpio_set(D14, 0);
            gpio_set(D15, 1);        
          }
          else
          {
            gpio_set(D12, 0);
            gpio_set(D13, 0);
            gpio_set(D14, 0);
            gpio_set(D15, 0);          
          }
          
          
          //PID数据处理
          PIDRegulation(&pid_value, adcnumber_left-adcnumber_right)  
          
          //舵机控制
          pwn_serve=800+pid_value.result;
    

    3.代码整体

    main.c文件

    #include "headfile.h"
    
    uint32 pwn_serve_init = 800;
    
    
    main(void)
    {
        DisableGlobalIRQ();
        board_init();
          //电机初始化
          //右轮设置
          gpio_init(D12, GPO, 0, GPIO_PIN_CONFIG);
          gpio_init(D13, GPO, 0, GPIO_PIN_CONFIG);
          //左轮设置
          gpio_init(D14, GPO, 0, GPIO_PIN_CONFIG);
          gpio_init(D15, GPO, 0, GPIO_PIN_CONFIG);
          pwm_init(PWM1_MODULE3_CHB_D1, 1000, 10000);
          pwm_init(PWM1_MODULE3_CHA_D0, 1000, 10000);
          
          //舵机初始化
          pwm_init(PWM4_MODULE2_CHA_C30, 50, 800); 
          
          //初始化ADC模块
          adc_init(ADC_1,ADC1_CH4_B15,ADC_8BIT);
          adc_init(ADC_1,ADC1_CH3_B14,ADC_8BIT);
          
          //中断初始化
          pit_init();
          pit_interrupt_ms(PIT_CH1, 10);
          
        EnableGlobalIRQ(0);
        
        while (1)
        {
          //pwm_duty(PWM4_MODULE2_CHA_C30, pwn_serve_init); 
        }
    }
    

    isr.c文件

    #include "headfile.h"
    #include "isr.h"
    
    typedef struct
    
    typedef struct
    {
      int KP;//比例系数
      int KI;//积分系数
      int KD;//微分系数
      int lasterror_1;//前一拍偏差  
      int lasterror_2;//前两拍偏差
      int result;//输出值
    }PID;
    
    
    
    //初始化pid参数
    PID pid_value={3,0,30,0,0,0};
    
    
    //ADC采集
    int adcnumber_right_value[10]={0}; 
    int adcnumber_left_value[10]={0};
    
    
    int pwn_serve=800;
    
    //PID算法
    void PIDRegulation(PID *vPID, int thiserror)
    {
      vPID->result = vPID->KP * ( thiserror - vPID->lasterror_1 ) + vPID->KI * thiserror + vPID->KD * ( thiserror - 2 * vPID->lasterror_1 + vPID->lasterror_2 );
      vPID->lasterror_2 = vPID->lasterror_1;
      vPID->lasterror_1 = thiserror;
    }
    
    
    void CSI_IRQHandler(void)
    {
        CSI_DriverIRQHandler();     //调用SDK自带的中断函数 这个函数最后会调用我们设置的回调函数
        __DSB();                    //数据同步隔离
    }
    
    void PIT_IRQHandler(void)
    {
        if(PIT_FLAG_GET(PIT_CH0))
        {
          PIT_FLAG_CLEAR(PIT_CH0);
        }
        
        if(PIT_FLAG_GET(PIT_CH1))
        {  
        
    	  int adcnumber_right=0;
    	  int adcnumber_left=0;
          //AD采集
          for(int i=0;i<10;i++)
          {
            adcnumber_right_value[i]=adc_convert(ADC_1,ADC1_CH4_B15);
            adcnumber_left_value[i]=adc_convert(ADC_1,ADC1_CH3_B14);
          }      
          adcnumber_right=(adcnumber_right_value[4]+adcnumber_right_value[5])/2;
          adcnumber_left=(adcnumber_left_value[4]+adcnumber_left_value[5])/2;
          
          //越界判断
          if(adcnumber_right>10&&adcnumber_left>10)
          {
            gpio_set(D12, 0);
            gpio_set(D13, 1);
            gpio_set(D14, 0);
            gpio_set(D15, 1);        
          }
          else
          {
            gpio_set(D12, 0);
            gpio_set(D13, 0);
            gpio_set(D14, 0);
            gpio_set(D15, 0);          
          }
          
          
          //PID数据处理
          PIDRegulation(&pid_value, adcnumber_left-adcnumber_right);
          
          //舵机控制
          pwn_serve=800+pid_value.result;//800为舵机中值
          pwm_duty(PWM4_MODULE2_CHA_C30,pwn_serve); 
           
          PIT_FLAG_CLEAR(PIT_CH1);//清除中断标记位
        }
        
        if(PIT_FLAG_GET(PIT_CH2))
        {
            PIT_FLAG_CLEAR(PIT_CH2);
        }
        
        if(PIT_FLAG_GET(PIT_CH3))
        {
            PIT_FLAG_CLEAR(PIT_CH3);
        }
    
        __DSB();
    }
    
    
    void GPIO2_Combined_16_31_IRQHandler(void)
    {
        if(GET_GPIO_FLAG(B15))
        {
            CLEAR_GPIO_FLAG(B15);//清除中断标志位
        }
    }
    
    
    
    void GPIO2_Combined_0_15_IRQHandler(void)
    {
        if(GET_GPIO_FLAG(MT9V03X_VSYNC_PIN))
        {
            //不用清除标志位,标志位在mt9v03x_vsync函数内部会清除
            if(1 == flexio_camera_type)mt9v03x_vsync();
        }
        if(GET_GPIO_FLAG(SCC8660_VSYNC_PIN))
        {
            //不用清除标志位,标志位在scc8660_vsync函数内部会清除
            if(2 == flexio_camera_type)scc8660_vsync();
        }
    }
    
    
    

    总结

    注意事项
    (1)本文章的使用了tb6612电机驱动芯片对电机进行驱动。
    (2)各个函数的操作都可以在相应的库里的.c文件和.h文件里查找。
    展开全文
  • 恩智浦公司的RT1064功能十分的强大,开发RT1064的IDE虽然是基于Eclipse开发的,但是功能也很丰富,类似查看FreeRTOS状态,不用手动配置烧录器(能够自动识别已有的部分烧录器(如J-Link)); 问题描述 最近开发过程...

    前言

    恩智浦公司的RT1064功能十分的强大,开发RT1064的IDE虽然是基于Eclipse开发的,但是功能也很丰富,类似查看FreeRTOS状态,不用手动配置烧录器(能够自动识别已有的部分烧录器(如J-Link));

    问题描述

    最近开发过程中遇到一个困扰:由于之前的板子是有外借内存,但是后面的板子取消了内存,所以只能用CPU内的内存,这样程序还是往之前的内存里跑,结果只能出现了bug(无法调试),程序根本进入不了Mian函数,但是简单的点灯程序可以正常的调试;
    根据数据手册我们可以看到RT1064的片上内存只有1M,而且这1M分为了三部分(ITCM、DTCM、OCRAM);
    在这里插入图片描述
    根据编译的信息,我们可以看到,这三块区域的分配为ITCM(128k)DTCM(128k)OCRAM(768k)

    在这里插入图片描述

    这里BOARD_SDRAM的大小并没有30M,所以我的程序默认是跑在了这里,所以导致了我的程序无法正常的运行,所以我们要切换内存区块

    1、打开项目属性栏

    在这里插入图片描述

    2、找到设置栏,更换程序运行的区域

    在这里插入图片描述

    3、将全局的数据放在OCRAM区块,堆栈放在DTCM区块,然后保存设置并关闭,重新编译,会发现程序运行的区块发生了改变;

    在这里插入图片描述
    然后运行程序便可以正常调试

    展开全文
  • RT1064学习笔记(1)--ADC例程(ADC Demo)

    千次阅读 2020-01-11 15:51:08
    RT1064之ADC例程 Ps:本例程主要作用是,展示如何使用QTIMER模块来实现正交解码。 主板为:逐飞RT1064 + 母板

    RT1064之ADC例程

    Ps:本例程主要作用是,展示如何使用ADC库函数。
    主板为:逐飞RT1064 + 母板

    一,ADC—模块

    1)简介:RT1052 有 2 个 ADC,每个 ADC 有 12 位、 10 位、 8 位可选,每个 ADC 有 16 个外部通道。 ADC 具有最高 1MS/s 采样率,支持单次或连续转换模式,可配置的采样时间和转换
    速度,支持硬件求平均,支持自动比较转换结果为小于、大于或等于某一设定的值,或者
    在设定的范围内、范围外。
    2)两个ADC,16个通道对应的管脚

    typedef enum    // 枚举ADC通道
    {
        ADC1_CH0_B27,    
        ADC1_CH1_B12,    
        ADC1_CH2_B13,    
        ADC1_CH3_B14,    
        ADC1_CH4_B15,    
        ADC1_CH5_B16,    
        ADC1_CH6_B17,    
        ADC1_CH7_B18,        
        ADC1_CH8_B19,        
        ADC1_CH9_B20,        
        ADC1_CH10_B21,       
        ADC1_CH11_B22,
        ADC1_CH12_B23,
        ADC1_CH13_B24,
        ADC1_CH14_B25,
        ADC1_CH15_B26,
        
        ADC2_CH0_B27,    
        ADC2_CH1_B28,    
        ADC2_CH2_B29,    
        ADC2_CH3_B30,    
        ADC2_CH4_B31,    
        ADC2_CH5_B16,    
        ADC2_CH6_B17,    
        ADC2_CH7_B18,        
        ADC2_CH8_B19,        
        ADC2_CH9_B20,        
        ADC2_CH10_B21,       
        ADC2_CH11_B22,
        ADC2_CH12_B23,
        ADC2_CH13_B24,
        ADC2_CH14_B25,
        ADC2_CH15_B26,
    }ADCCH_enum;
    
    //此枚举定义不允许用户修改
    typedef enum    // 枚举ADC通道
    {
        ADC_8BIT,     //8位分辨率
        ADC_10BIT,    //10位分辨率
        ADC_12BIT,    //12位分辨率
    
    }ADCRES_enum;
    
    二,ADC采集程序解析

    1)代码

    //-------------------------------------------------------------------------------------------------------------------
    //  @brief      ADC初始化
    //  @param      adcn            选择ADC模块(ADC_1、ADC_2)
    //  @param      ch              选择ADC通道
    //  @param      resolution      选择选择通道分辨率(如果同一个模块初始化时设置了不同的分辨率 则最后一个初始化的分辨率生效)
    //  @return     void
    //  Sample usage:               adc_init(ADC_1,ADC1_CH0_B27,ADC_8BIT);//初始化B27为ADC功能 分辨率为8位
    //-------------------------------------------------------------------------------------------------------------------
    void adc_init(ADCN_enum adcn, ADCCH_enum ch, ADCRES_enum resolution)
    

    2)adc_convert函数(AD转换值获取)

    /-------------------------------------------------------------------------------------------------------------------
    //  @brief      ADC转换一次
    //  @param      adcn            选择ADC模块(ADC_1、ADC_2)
    //  @param      ch              选择ADC通道
    //  @return     void
    //  Sample usage:               adc_convert(ADC_1,ADC1_CH0_B27);
    //-------------------------------------------------------------------------------------------------------------------
    uint16 adc_convert(ADCN_enum adcn, ADCCH_enum ch)
    

    3)while循环中的初采集代码

        while(1)
        {
            //采集一次ADC
            adc_value = adc_convert(ADC_1,ADC1_CH3_B14);
            systick_delay_ms(100);
            
        }
    
    三,整体代码与运行测试

    1)整体代码展示

    #include "headfile.h"
    
    uint16 adc_value;
    int main(void)
    {
        DisableGlobalIRQ();
        board_init();   //务必保留,本函数用于初始化MPU 时钟 调试串口
        
        //初始化ADC_1模块 3通道 引脚为B14, 精度为12位
    	//每一个ADC模块 所包含的通道,分辨率应设置为一样
    	//如果设置不一样则最后一个初始化的分辨率生效
        adc_init(ADC_1,ADC1_CH3_B14,ADC_8BIT);
        
        //通过在线调试直接查看adc_value的值
    	//将ADC引脚接到GND,adc_value的值在0附近
    	//将ADC引脚接到3.3V,adc_value的值在255附近
        EnableGlobalIRQ(0);
           
        while(1)
        {
            //采集一次ADC
            adc_value = adc_convert(ADC_1,ADC1_CH3_B14);
            systick_delay_ms(100);
            
        }
        
    }
    

    2)采集VCC
    数值:254
    在这里插入图片描述
    数据:0
    在这里插入图片描述

    展开全文
  • NXP i.MX RT1064-EVK开发板入门

    千次阅读 2019-04-01 16:59:46
    我对i.MX RT处理器系列很感兴趣,因为它是机器学习研究项目中有吸引力的解决...到目前为止,RT1064是RT系列中的高端处理器。让我感兴趣的是它有4MB的片上FLASH存储器(其他的型号都是无闪存的)。 i.MX RT概述 在器...

    我对i.MX RT处理器系列很感兴趣,因为它是机器学习研究项目中有吸引力的解决方案。机器学习需要大量的计算能力,而且由于i.MX RT ARM Cortex-M7的运行频率高达600 MHz,并且有大量的RAM和FLASH内存,因此这似乎非常合适。到目前为止,RT1064是RT系列中的高端处理器。让我感兴趣的是它有4MB的片上FLASH存储器(其他的型号都是无闪存的)。

    在这里插入图片描述

    i.MX RT概述

    在器件中带有存储器绝对是一个优势:没有片上闪存的电路板启动都比较具有挑战性。在器件中具有FLASH存储器,具有更容易启动序列的优点。只有BGA对于定制电路板本身就是一个挑战,或者可能需要在外部生产电路板。

    在这里插入图片描述

    内部4 MByte FLASH与NXP Kinetis或LPC上的内部FLASH不同:它看起来像内部将4M Winbond W25Q32JV内存芯片绑定到QSPI,因此内部和外部FLASH内存确实是QSPI:

    1. 内部4 MByte WinBond W25Q32JV串行FLASH:基地址:0x7000’0000,大小:0x40’0000

    2. 外部8 MByte集成硅解决方案ISSI IS25WP064AJBLE串行闪存:基地址:0x6000’0000,大小:0x80’0000

    更多内容请参考以下链接:https://www.yiboard.com/thread-1130-1-1.html

    展开全文
  • RT1064学习笔记(3)--串口例程(UART Demo)

    千次阅读 2020-01-11 20:52:51
    RT1064之UART例程 Ps:本例程主要作用是,展示如何使用UART发送数据 主板为:逐飞RT1064 + 母板 一,QTMR—四路通道定时器 1)简介:RT1052 芯片具有多达 8 个 LPUART 外设用于串口通讯,它是 Low Power ...
  • RT1064学习笔记__函数初始化详解

    千次阅读 2020-06-02 21:36:39
    Ps:主板为:逐飞RT1064 + 母板 一、 systick_delay_ms() 毫秒级延时函数 //------------------------------------------------------------------------------------ // @brief 毫秒级systick延时函数 // @param ms...
  • 基于RT1064对于四轮寻迹智能车的设计工作笔记 目录基于RT1064对于四轮寻迹智能车的设计工作笔记1.前篇(1)adc (模数/数模转换)(2)pit(定时中断)(3)pwm(波特率)(4)gpio(引脚使用)2.舵机篇3.电机篇4....
  • RT1064之编码器例程 Ps:本例程主要作用是,展示如何使用QTIMER模块来实现正交解码。 主板为:逐飞RT1064 + 母板 一,QTMR—四路通道定时器 1)简介:与 PIT(周期中断定时器)和 GPT(通用定时器)相比 QTMR 定时器...
  • RT1064学习笔记(5)--Flash例程(Flash Demo)

    千次阅读 2020-01-18 14:29:09
    RT1064之Flash例程 Ps:本例程主要作用是,展示如何使用FLASH储存数据的概念 主板为:逐飞RT1064 + 母板 一,NAND flash 控制原理(基于RT1052) NAND flash 作用类似于电脑的固态硬盘,主要用于存储数据。相同...
  • RT1064之ADC例程 Ps:本例程主要作用是,展示如何使用GPIO Interrupt以及GPIO中断的概念 主板为:逐飞RT1064 + 母板 一,GPIO中断简介(基于RT1052) RT1052 拥有 5 组 GPIO,每组 GPIO 拥有 32 个 GPIO 输入...
  • RT1064-ADC

    2020-09-23 20:53:37
    RT1052 有 2 个 ADC,每个 ADC 有 12 位、 10 位、 8 位可选,每个 ADC 有 16 个外部通道。 ADC 具有最高 1MS/s 采样率,支持单次或连续转换模式,可配置的采样时间和转换 速度,支持硬件求平均,支持自动比较转换...
  • RT1064在烧录时按下了复位导致的程序无法烧录的问题解决方法 近来本人由于操作上的失误,在烧录程序时误将RT1064板的RST按下,后导致每次烧录时都会出现Communication Failue的错误 解决办法,按住RST边上的MODE按钮...
  • 调试RT1064的CAN通信时,使用了SDK中的Demo【flexcan_interrupt_transfer】,但是这个例子中,过滤了ID,只接收固定ID的报文,部分源码如下: /* Set Rx Masking mechanism. */ FLEXCAN_SetRxMbGlobalMask(EXAMPLE...
  • RT1064-gpio

    2020-09-15 14:04:47
    gpio初始化 void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, uint32 pinconf) 第一个参数:引脚,用哪个就写哪个,用B9填B9,具体的在common.h文件中 typedef enum 第二个参数:引脚的方向 输出:GPO ...
  • 我使用Tickless空闲模式将FreeRTOS应用程序移植到NXP i.MX RT1064开发板上,突然之间,开发板对任何调试器连接都没有响应。幸运的是,该开发板会并没有真正的变砖,但我花了很长时间才找到恢复它的方法。因此,当您...
  • 使用RT1064官方的Demo板进行调试,烧录代码时,调出如下弹窗;尝试关闭IDE和关机重启电脑都没有用[狗头保命] 解决办法 1.正常打开MCUXpresso IDE; 2.导入SDK中的例子,不要使用自己的代码,确保代码没有问题; 3....
  • 正如“恩智浦i.MX RT1064-EVK开发板入门指南”一文中0所述,RT1064-EVK开发板上有一个基于LPC4322的新的调试接口。 基于LPC4322JET100的调试接口 Freelink(又名OpenSDA、DAP-link或DAPlink) 在恩智浦的数据手册...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 210
精华内容 84
关键字:

rt1064