样例程序:SPWM + V/F 1. 本程序实现的功能如下: z 配置 CAPCOM6。 z 使用 CC60,CC61,CC62,COUT60,COUT61,COUT62 作为 PWM 输出,工作于互补 输出模式。 z 在 T12 定时中断中,使各个通道的占空比按照 SPWM 规律变化。 使用到的模块:CAPCOM6、GPT1。 2. 模块介绍 2.1 CAPCOM6 XC164CM 提供功能强大的 PWM 比较捕获单元 CCU6,内部包含 2 路 PWM 定时器, T12 模块提供 3 对比较/捕捉通道,T13 提供 1 路 PWM 输出,使 XC164CM 适合各种交流电 机或逆变器的控制。内部集成适用于 BLDC 控制的霍尔信号、反电动势检测功能。此外还 包括用于多项电机控制的块交换模式。 关于 CAPCOM6 模块功能的详细介绍,请参照 XC164CM 用户手册。 3.具体实现 开始 DAVE 配置 生成代码 添加用户自定义程序 编译、下载、运行 4. DAVE 配置 4.1 New project: select XC164cm, 4. 2 The project settings System clock 4.3 配置 CAPCOM6 使能模块 配置 CC60、CC61、CC62、COUT60、COUT61、COUT62 为输出 配置 T12 配置各个通道 选择 compare mode 3, T12 modulation, deadtime generation, duty cycle=50%, 以通道 0 为例: CC60 配置 COUT60 配置 占空比及死区时间配置 通道 1、2 配置相同。 配置中断,在 Trap/Interrupt 页面 Enable T12 node 中断优先级配置: 将 CCU6 I2 INT 中断从右边拖到左边表格中。选择优先级和组别。 在 functions 页面,选择 CCU6_vInit,生成 ccu6.c 文件。 5.利用 DAVE 生成代码。 6.修改用户代码 6.1 生成 uVision 工程文件 做完以上步骤之后工程文件夹中会出现 keil 图标的 dpt 文件,双击进入 keil 环境。第一 次进入 keil 环境需要设置:project-options for target ‘target 1’。如下所示: 6.2 Main.c 添加 while(1); void main(void) { // USER CODE BEGIN (Main,2) // USER CODE END MAIN_vInit(); // USER CODE BEGIN (Main,4) while(1); // 添加 while(1)。 // USER CODE END。 6.3 将例程中的 SPWM_VVVF.h, SPWM_VVVF.c 文件拷贝到项目所在文件夹。 关于 spwm 生成相关的说明请参照附 SPWM_VVVF.C 实现 。 6.4 向项目中添加 SPWM_VVVF.C。 出现的菜单中选择 Add Files to Group “User Files” 添加完后如下所示 6.3 6.4 Main.h 添加对文件 SPWM_VVVF.h 的调用。 // USER CODE BEGIN (MAIN_Header,10) #include "SPWM_VVVF.h" // USER CODE END CCU6.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 7.编译 点击 图标进行编译连接。如有错误进行更改,直到出现‘0 Errors found.’。 8.下载 利用 memtool 软件将上面生成的 h86 文件下载到单片机。打开 memtool 软件,点击菜单 Targe-Change,选择 XC164CM-8F。界面如下: 点击 OK 出现如下对话框。 点击‘connect’进行通讯连接。通讯成功之后,按照顺序 open file…-select all-add sel.>>将 h86 文件添加到右边框中,然后选择’Erase…’和’Program’进行擦除、编程。如有必 要可点击’Verify’进行校验。 9.运行 附: SPWM_VVVF.C 实现 SPWM_VVVF.c ¾ SIN 表 计算 0-90 度的 SIN 表,对应于 0 – 0x7fff 。由于 SIN 函数的对称性,其他象限从第 一个象限的数据生成。 const unsigned int sin_TABLE[250]; // SIN 表 unsigned char Get_F_Command(); // 获取频率信息。例程中仅通过软件指定。 unsigned int UVW_Cal(unsigned int index); // 根据象限不同,利用 0-90 度对应的 SIN 数据计算其他象限的 SIN 值,并根据 V/F 曲线得到对应的数据 PWM 比较值。 PWM 计算值:包含 V/F 控制部分。 U_Phase = Neutral + A * Sin[0 °- 360°] 其中 A 为根据 V/F 控制得到的调制深度而决定的正弦波的幅值。Neutral 为中线。 comp_temp = (long)(((long)sin_TABLE[index] * (long)VF_Mul_F >> 16) + 0x7fff) * (long)Neutral >> 16; 其中 z Neutral 为 1/2 T12 周期值。 z VF_Mul_F 为根据 V/F 曲线及当前输出频率得到的 PWM 调制深 度。 ¾ SPWM_VVVF(void) 定义变量 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; // 输出频率值 计算步长 // 载波频率 10k,在一个正弦波中包含 1000 点 //设 n = { (1/F_out) / (1/F_carry )} ; Î n = F_carry / F_OUT; // step = 1000 / n = F_OUT / 10; step = (float ) F_OUT / 10 ; 更新 PWM 占空比。 CCU6_CC60SR = Tu; CCU6_CC61SR = Tv; CCU6_CC62SR = Tw; CCU6_vEnableShadowTransfer_CCU6_TIMER_12();