飞思卡尔微控制器程序示例与舵机控制

需积分: 10 7 下载量 146 浏览量 更新于2024-09-28 1 收藏 33KB DOC 举报
"这份资源包含了飞思卡尔微控制器编程的一些基本示例,主要涉及舵机和电机控制的PWM(脉宽调制)设置。作者提供了相关的程序代码,并且定义了不同角度对应的PWM值,便于调整舵机的角度。" 在飞思卡尔的微控制器编程中,脉宽调制(PWM)是一种常用的技术,用于模拟信号输出或控制执行器如电机和舵机。在这个程序中,可以看到以下几个关键知识点: 1. **包含头文件**:`#include<hidef.h>` 和 `#include<mc9s12dg128.h>`,这两个头文件分别提供了通用的定义和宏以及微控制器的具体信息。`mc9s12dg128.h` 是针对飞思卡尔MC9S12DG128型号微控制器的特定头文件,包含了该芯片的相关寄存器和常量定义。 2. **预处理指令**:`#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"` 这个预处理指令告诉编译器链接阶段使用的微控制器型号是`mc9s12dg128b`。 3. **定义常量**:`#define mid520` 定义了舵机处于正中的PWM值为520。这意味着当舵机的PWM周期中高电平时间占520单位时,舵机会处于中心位置。 4. **数据结构**:`unsigned char ch_0...ch_13` 和 `unsigned int WDs0[27]`, `WDr[27]`, `f[14]`, `Sen_QuanZhong[14]` 定义了一些字符变量和无符号整数数组。其中,`WDs0` 和 `WDr` 分别存储了舵机向左和向右转动时,不同角度对应的PWM周期占空比。`Sen_QuanZhong` 存储了传感器采集到的关节角度数据。 5. **函数定义**:`void PWM_int(void)` 是一个PWM中断服务函数。在这个函数中: - `PWME=0X00;` 清除PWM启用位,确保在函数开始时所有PWM通道关闭。 - `PWMCTL=0XC0;` 设置通道6和7级联,通道4和5级联,以便控制舵机和电机。 - `PWMCLK=0X00;` 选择ClockB作为PWM6和7的时钟源,ClockA作为PWM4和5的时钟源。 - `PWMPOL=0XFF;` 在每个PWM周期开始时,所有通道输出高电平。 - `PWMCAE=0X00;` 设置PWM计数器左对齐,即在定时器重装载时立即更新输出。 - `PWMPRCLK=0X55;` 设置PWM预分频器为总线时钟的1/32。 - `PWMPER67=4999;` 和 `PWMPER45=4999;` 设置PWM周期,这里周期长度相同,用于舵机和电机控制。 - `PWMDTY67=520;` 设置舵机PWM的占空比,520对应中心位置。 - `PWMDTY45=2999;` 设置电机PWM的占空比。 6. **舵机和电机控制**:通过调整PWM通道的占空比,可以改变舵机和电机的转速或方向。在本例中,`PWMDTY67` 的值可以改变以控制舵机的角度,而 `PWMDTY45` 则用于控制电机的速度。 这个程序提供了一个基础的框架,可以在此基础上根据实际应用需求进行扩展和修改,例如增加更多通道的PWM控制,或者实现更复杂的运动控制算法。同时,`Sen_Jiaquan`, `Sen_FlagCount` 及其他未在代码中使用的变量可能是用于传感器数据处理或状态记录的,这表明完整的系统可能涉及到传感器输入和实时控制。