首页资源分类嵌入式处理器其它 > 英飞凌16位单片机产生SPWM例程介绍

英飞凌16位单片机产生SPWM例程介绍

已有 445510个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:英飞凌16位单片机SPWM

    分    享:

    文档简介

    英飞凌16位单片机产生SPWM例程介绍

    文档预览

    样例程序:SPWM + V/F 1. 本程序实现的功能如下: 配置CCU60, 使用CC60,CC61,CC62,COUT60,COUT61,COUT62 作为PWM 输出,工作于互补 输出模式。 在T12 定时中断中,使各个通道的占空比按照SPWM 规律变化。 2.使用到的模块:CCU6 。 2.1XE164F/XE164FM 的 CCU6 模块介绍 CCU6 为具有特定应用模式的高精度 16 位捕获和比较单元,主要用于 AC 电机控制应 用。CCU6 的特殊工作模式支持使用霍尔传感器或反电动势检测控制方案的无刷直流控制。 其由带有三路捕获/比较通道的定时器T12 模块和带有一路比较通道的定时器T13 模块组成。 定时器 T12 模块特性: l 3 路捕获/比较通道,各路可单独用作捕获或比较通道 l 支持三相 PWM 产生(6 路输出,每相两路信号分别用于控制上桥臂或下桥臂开关) l 16 位精度,最大计数频率=外设时钟频率 l 各路通道的死区事件控制,以避免功率器件短路 l T12 寄存器同步更新 l 支持中心对齐和边沿对齐 PWM 产生 l 支持单次模式 l 可由外部时间按启动定时器 l 能够对外部事件计数 l 支持多个中断请求源 l 支持类磁滞控制模式 定时器 T13 模块特性: l 一个独立的比较通道输出 l 16 位精度,最大计数频率=外设时钟频率 l 可与 T12 同步 l 周期匹配和比较匹配时产生中断 l 支持单次模式 l 可由外部事件启动定时器 l 能够对外部事件计数 附加特性: l 支持用于驱动无刷直流电机的块切换 l 通过霍尔传感器序列进行位置检测 l 支持位置输入信号的噪声滤波 l 块切换的自动转速测量和切换控制 l 综合错误处理 l 由外部信号控制快速急停,无需 CPU 干预 CCU6 模块框图 3.操作流程 开始 DAvE 配置 生成代码 添加用户程序 编译、下载、运行 4.DAvE 配置 4.1 New Project:选择XE164F/XE164FM XE164F XE164FM 4.2 The project settings XE164F XE164FM System clock XE164F XE164FM 4.3 CCU6 配置(XE164F 和 XE164FM 配置基本相同,以 XE164F 为例) 配置 CCU60 使能 CCU60 配置输入/输出管脚 配置 T12 配置通道 对 CC61、CC62 通道做同样配置 中断配置 配置中断优先级 选择需要 DAvE 生成的函数 5.利用DAvE 生成代码 点击 的函数。 保存project,点击 DAvE 自动生成代码,生成的代码即包括前面所选择 6.修改用户代码 6.1 生成Tasking 工程文件 在 Project Space 中加入 Project,点击 Add Existing Projects… Look in 的路径为DAvE所生成的文件所在路径 Files of type 中选 Infineon DAvE Project Files 选中Infineon DAvE Project文件 点击Open ,Project添加到Project Space中,往Project中添加文件。点击 把DAvE 生成的文件添加到project中 把新添加入的Project设定为Current Project。 点击 对project进行设置 选则Processor XE164F XE164FM 选择Output Format 选择Intel Hex Output Format 6.2 添加用户代码(XE164F和XE164FM添加的代码基本相同) 在工程中加入文件 SPWM_VVVF.h 和 SPWM_VVVF.c 在main.h中添加代码 Main.h 添加对文件SPWM_VVVF.h 的调用。 // USER CODE BEGIN (MAIN_Header,10) #include "SPWM_VVVF.h" // USER CODE END 在CCU60.c中添加代码 在T12 定时中断中添加 产生VVVF 相关的程序 void CCU6_viNodeI2(void) interrupt CCU6_NodeI2_INT { // USER CODE BEGIN (NodeI2,2) // USER CODE END if(CCU6_IS & 0x0080) // if CCU6_IS_T12PM { // timer T12 period match detection // USER CODE BEGIN (NodeI2,19) SPWM_VVVF(); // USER CODE END CCU6_ISR = 0x0080; // clear flag CCU6_IS_T12PM } } // End of function CCU6_viNodeI2 SPWM_VVVF.h 和 SPWM_VVVF.c 具体代码见附件 点击图标 进行编译连接。如有错误进行更改,直到出现‘total errors: 0’。 8.下载 利用memtool 软件将上面生成的hex 文件下载到单片机。 打开memtool 软件,点击菜单Targe-Change,选择Easy Kit with XE164-96F AB-Step(DAS)/ Kit with XE164FM-72F (DAS)界面如下 XE164F XE164FM 点击OK 出现如下对话框。 点击‘connect’进行通讯连接。通讯成功之后,按照顺序open file…-select all-add sel.>>将需要下载的hex 文件添加到右边框中,然后选择’Erase…’和’Program’进行擦 除、编程。如有必要可点击’Verify’进行校验。 9.运行。 附件: SPWM_VVVF.h //**************************************************************************** // @Prototypes Of Global Functions //**************************************************************************** void init_SPWM(void); void SPWM_VVVF(void); SPWM_VVVF.C /* imports */ #include "main.h" #include "SPWM_VVVF.h" /* variables */ static float u_index = 0,v_index = 333,w_index = 667; static unsigned int Tu,Tv,Tw; static float step; unsigned int F_OUT = 200; #define VF_RATIO 327 // FFFF / 200 /* Table */ const unsigned int sin_TABLE[250]= { 0 ,206 ,412 ,618 ,823 ,1029 ,1235 ,441 ,1646 ,1852, 2057 ,2263 ,2468 ,2673 ,2879 ,3084 ,3289 ,3493 ,3698 , 3902, 4107 ,4311 ,4515 ,4719 ,4922 ,5126 ,5329 , 5532 ,5735 ,5938, 6140 ,6342 ,6544 ,6746 ,6947 ,7148 , 7349 ,7549 ,7749 ,7949, 8149 ,8348 ,8547 ,8746 ,8944 ,9142 ,9339 , 9536 ,9733 , 9930, 10126 ,10321 ,10516 ,10711 ,10905 ,11099 , 11293 ,11486 , 11679 , 11871, 12062 ,12254 ,12444 ,12634 ,12824 ,13013 , 13202 ,13390 ,13578 ,13765, 13952 ,14138 ,14323 ,14508 ,14692 ,14876 , 15059 ,15242 ,15424 , 15605, 15786 ,15966 ,16145 ,16324 ,16502 ,16680 , 16857 ,17033 ,17208 ,17383, 17557 ,17731 ,17904 ,18076 ,18247 ,18418 ,18588 ,18757 ,18925 ,19093, 19260 ,19426 ,19592 ,19756 ,19920 ,20083 ,20245 ,20407 ,20568 ,20727, 20886 ,21045 ,21202 ,21359 ,21514 ,21669 ,21823 ,21976 , 22129 ,22280, 22431 ,22580 ,22729 ,22877 ,23024 ,23170 ,23315 ,23459 , 23602 ,23745, 23886 ,24027 ,24166 ,24305 ,24442 ,24579 , 24715 ,24849 ,24983 ,25116, 25247 ,25378 ,25508 ,25637 ,25764 ,25891 , 26017 ,26141 ,26265 ,26388, 26509 ,26630 ,26749 ,26867 ,26985 ,27101 ,27216 ,27330 ,27443 ,27555, 27666 ,27776 ,27885 ,27992 ,28099 ,28204 ,28308 ,28411 ,28513 ,28614, 28714 ,28813 ,28910 ,29006 ,29102 ,29196 ,29289 ,29380 , 29471 ,29560, 29648 ,29736 ,29821 ,29906 ,29990 ,30072 ,30153 ,30233 ,30312 ,30390, 30466 ,30541 ,30615 ,30688 ,30759 ,30830 ,30899 ,30967 ,31034 ,31099, 31163 ,31226 ,31288 ,31349 ,31408 ,31466 ,31523 ,31578 ,31633 ,31686, 31738 ,31788 , 31837 ,31886 ,31932 ,31978 ,32022 ,32065 ,32107 ,32147, 32187 ,32225 ,32261 ,32297 ,32331 ,32364 ,32395 ,32425 ,32454 ,32482, 32509 32702 }; ,32534 ,32558 ,32580 ,32602 , 32622 ,32640 ,32658 ,32674 ,32689, ,32715 ,32726 ,32735 ,32744 ,32751 ,32757 ,32761 ,32764 ,32766 /* subprogams */ unsigned char Get_F_Command() { unsigned char Freq; // get F_Command; //e.g. Freq = 50; return Freq; } unsigned int UVW_Cal(unsigned int index) { unsigned char state; unsigned int comp_temp; const unsigned int Neutral = 0xce3; unsigned int VF_Mul_F; //unsigned int VF_Mul_F = 0xffff; VF_Mul_F = (int)F_OUT * VF_RATIO; if(index >=0 && index < 250) state = 0; else if(index >= 250 && index < 500) state = 1; else if(index >= 500 && index < 750) state = 2; else if(index >= 750 && index < 1000) state = 3; switch(state) { case 0: comp_temp = (long)(((long)sin_TABLE[index] * (long)VF_Mul_F >> 16) + 0x7fff) * (long)Neutral >> 16; break; case 1: comp_temp = (long)(((long)sin_TABLE[499 - index] * (long)VF_Mul_F >> 16) + 0x7fff) * (long)Neutral >> 16; break; case 2: comp_temp = (long)(Neutral * (long)(0x7fff - ((long)VF_Mul_F * (long)sin_TABLE[index - 500]>>16))) >> 16; break; case 3: comp_temp = ((long)Neutral * (long)(0x7fff - ((long)VF_Mul_F * (long)sin_TABLE[999 - index]>>16))) >> 16; break; default: break; } return comp_temp; } void SPWM_VVVF(void) { static unsigned char u_state = 0; static unsigned char u_l; // carrier frequency 10k, point in sine wave 1000. // n = { (T = 1/f) / 0.0001 } ; step = 1000 / n; step = (float ) F_OUT / 10 ; Tu = UVW_Cal(u_index); Tv = UVW_Cal(v_index); Tw = UVW_Cal(w_index); u_index += step; if(u_index >= 1000) { u_index = 0; F_OUT = Get_F_Command(); } // update Frequency v_index += step; if(v_index >= 1000) { v_index = 0; F_OUT = Get_F_Command(); } // update Frequency w_index += step; if(w_index >= 1000) { w_index = 0; F_OUT = Get_F_Command(); } // update Frequency CCU60_CC60SR = Tu; CCU60_CC61SR = Tv; CCU60_CC62SR = Tw; CCU60_vEnableShadowTransfer_CCU60_TIMER_12(); }

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。