样例程序 : T12 + T13 + AD + PEC 1. 简介本程序实现功能如下 : 配置 CCU6 工作于三相输出模式 使用通道 0 比较匹配中断触发 T13 内部硬件直接实现 T13 工作于 Single shot 模式, 当周期中断时, 硬件触发 ADC (Injection mode) 转换完成以后, 使用 PEC 将存放于 ADC_DAT2 中的转换结果传送到用户指定的数组中 PEC 传输 10 次以后, 产生 End of PEC 中断, 在中断处理程序中重新配置 PEC 寄存器 重新使能 PEC 使用到的模块 :ADC,PEC,CCU6 2. 模块功能介绍 2.1 ADC XC164CM 系列提供 14 路转换通道,8/10bit 转换精度,8 位最快转换时间 2.15us 工作模式 : Fix channel single conversion: 转换指定通道一次 Fix channel continuous conversion: 重复转换指定通道 Auto scan single conversion: 转换指定组的通道一次 Auto scan continuous conversion: 重复转换指定组的通道 Wait for read mode: 当一次转换结束后, 停止 A/D 转换直至上次转换结果被读取 Channel injection mode: 在当前转换组中插入对指定通道的转换 关于 ADC 模块功能的详细介绍, 请参照 XC164CM 用户手册 2.2 PEC XC164CM 提供 8 路类 DMA 功能的 PEC 通道 可以由任何中断请求触发, 在任意两个内存地址之间传递字节数据或字数据 仅仅从当前 CPU 进程中 窃取 一个时钟周期去完成, 无需保存 / 恢复现场 占用时间少, 效率高 每路 PEC 通道拥有独立的计数器, 用于指定传输的次数, 当传输完指定次数后, 可以触发 EOP (End of PEC) 中断 关于 PEC 模块功能的详细介绍, 请参照 XC164CM 用户手册 2.3 CCU6 XC164CM 提供功能强大的 PWM 比较捕获单元 CCU6, 内部包含 2 路 PWM 定时器, T12 模块提供 3 对比较 / 捕捉通道,T13 提供 1 路 PWM 输出, 使 XC164CM 适合各种交流电机或逆变器的控制 内部集成适用于 BLDC 控制的霍尔信号 反电动势检测功能 此外还包括用于多项电机控制的块交换模式 关于 CCU6 模块功能的详细介绍, 请参照 XC164CM 用户手册 2. 操作流程
开始 DAVE 配置 生成代码 添加用户自定义程序 编译 下载 运行 4. DAVE 配置 4.1New project: select XC164cm 4.2 The project settings
System clock 4.3 CCU6 配置使能 CCU6 模块
配置 CC60 CC61 CC62 COUT60 COUT61 COUT62 为输出 配置 T12
配置 T13 配置各个通道选择 compare mode 3, T12 modulation, deadtime generation, duty cycle=50%,
以通道 0 为例 : CC60 配置 COUT60 配置 占空比及死区时间配置
通道 1 2 配置相同 配置中断, 在 Trap/Interrupt 页面 使能 T12 中断节点
中断优先级配置 : 将 CCU6 I2 INT 中断从右边拖到左边表格中 选择优先级和组别 在 functions 页面, 选择 CCU6_vInit 以生成 ccu6.c 文件 4.4 配置 ADC
使能模块 选择 enhanced mode, enable end-of-injected-conversion interrupt to trigger the PEC 配置 enhanced mode. 1. the fixed channel, 2. wait for read mode
配置 injection mode control 1. enable channel injection 2. select the channel 3. select the CCU6 for trigger(t13 period match) 4. resolution Port setting: just use the channel AN0.
中断优先级配置 : 将 ADC error INT 中断从右边拖到左边表格中 选择优先级和组别 选择 ADC_vInit 以生成 adc.c 文件
4.5 配置 PEC 在 ADC => PEC 页面, 根据 ADC error INT 的中断优先级和组别, 选择 PEC 通道, 在此选择通道 2 在 PEC 通道 2 配置页面 1. use decrement counter 2. counter = 10 3. increment destination pointer 4. transfer as word 5. check the two end of PEC interrupt node and request 6. set the ADC_DAT2 as the source pointer
4. 6 中断设置在中断配置部分, 选中 End of PEC 中断 配置 EOP 中断的优先级, 在中断配置页面, 将 EOP INT 拖到左边对应的位置 5. 利用 DAVE 生成代码
6. 修改用户代码 6.1 生成 uvsion 工程文件 做完以上步骤之后工程文件夹中会出现 keil 图标的 dpt 文件, 双击进入 keil 环境 第一次进入 keil 环境需要设置 :project-options for target target 1 如下所示 : 6.2 修改 Main.c 添加 while(1); // USER CODE BEGIN (Main,4) while(1); // USER CODE END 6.3 修改 ADC.c 1. 定义数组, 长度 10 // @Global Variables //*********************************** // USER CODE BEGIN (ADC_General,7) unsigned int ADC_Result[10]; // USER CODE END 2. 在函数 ADC_vInit 最后部分, 将 ADC_Result 配置为 PEC 的目标地址 // USER CODE BEGIN (Init,3) DSTP2 = _sof_(adc_result); //set destination pointer // USER CODE END
6.4 修改 Int.c 1. //************************************************************** // @Imported Global Variables //************************************************************** 7. 编译 // USER CODE BEGIN (INT_General,6) extern unsigned int ADC_Result[10]; // 添加 // USER CODE END 2.void INT_viEOP(void) interrupt EOPINT 添加如下功能, void INT_viEOP(void) interrupt EOPINT { // USER CODE BEGIN (EOP,2) // USER CODE END if(pecisnc_c2ir) // end of PEC channel 2 { PECISNC_C2IR = 0; // USER CODE BEGIN (EOP,5) PECC2 = 0x520A; // load PECC2 control register DSTP2 = _sof_(adc_result); //set destination pointer // USER CODE END } } // End of function INT_viEOP 传输完成后,PEC 计数器减为 0,PEC 停止, 需要重新指定传输次数 由于每次 PEC 传输后, 目标寄存器自动增加, 因此重置通道 2 目标寄存器,Functions: reload the PECC2 control register (the decrement counter = 10) 点击图标进行编译连接 如有错误进行更改, 直到出现 0 Errors found. 8. 下载利用 memtool 软件将上面生成的 h86 文件下载到单片机 打开 memtool 软件, 点击菜单 Targe-Change, 选择 XC164CM-8F 界面如下 :
击 OK 出现如下对话框 点 点击 connect 进行通讯连接 通讯成功之后, 按照顺序 open file -select all-add sel.>> 将 h86 文件添加到右边框中, 然后选择 Erase 和 Program 进行擦除 编程 如有必要可点击 Verify 进行校验 9. 运行