dspF28335编程,机械手臂控制角度,编程包括用PWM控制周期T,定时器中断,AD中断,GPIO初始化。具体程序举例
时间: 2024-03-24 19:39:12 浏览: 62
机械臂控制程序
关于dspF28335编程,机械手臂控制角度的程序,以下是一个简单的示例:
```c
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
// 定义PWM周期
#define PWM_PERIOD 5000
// 定义ADC采样周期
#define ADC_PERIOD 10000
// 定义机械手臂角度变量
Uint16 arm_angle = 0;
// PWM初始化函数
void InitEPwm1()
{
EPwm1Regs.TBPRD = PWM_PERIOD; // 设置PWM周期
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 设置计数器模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相位补偿
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 设置高速时钟分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 设置时钟分频
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 设置同步触发时机
EPwm1Regs.CMPA.half.CMPA = PWM_PERIOD / 2; // 设置占空比
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // 空闲时输出设置
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 升沿时输出设置
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; // 空闲时输出设置
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // 升沿时输出设置
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 设置计数器事件
EPwm1Regs.ETSEL.bit.INTEN = 1; // 使能中断
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 中断周期
}
// 定时器初始化函数
void InitCpuTimer1()
{
ConfigCpuTimer(&CpuTimer1, 150, ADC_PERIOD);
CpuTimer1Regs.TCR.all = 0x4001; // 使能定时器,使能中断
}
// ADC初始化函数
void InitAdc()
{
AdcRegs.ADCTRL1.bit.RESET = 1; // 复位ADC
AdcRegs.ADCTRL1.bit.SUSMOD = 3; // 立即停止采样
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x3F; // 采样窗口长度
AdcRegs.ADCTRL1.bit.CPS = 0; // 时钟分频
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 启用组转换模式
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; // 启用PWM触发
AdcRegs.ADCMAXCONV.all = 0x0001; // 设置转换数
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // 选择ADC通道
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能ADC中断
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // 复位ADC序列
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // 启动ADC转换
}
// GPIO初始化函数
void InitGpio()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all = 0; // 设置GPIO模式
GpioCtrlRegs.GPADIR.all = 0xFFFF; // 设置GPIO方向
GpioCtrlRegs.GPAPUD.all = 0; // 禁用上拉
GpioCtrlRegs.GPAGMUX1.all = 0; // 设置GPIO模式
GpioCtrlRegs.GPAGMUX2.all = 0; // 设置GPIO模式
GpioCtrlRegs.GPADIR.all = 0xFFFF; // 设置GPIO方向
GpioCtrlRegs.GPAPUD.all = 0; // 禁用上拉
EDIS;
}
// ADC中断服务函数
interrupt void AdcIsr()
{
arm_angle = AdcResult.ADCRESULT0; // 获取ADC采样值
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断标志位
}
// 定时器中断服务函数
interrupt void CpuTimer1Isr()
{
CpuTimer1.InterruptCount++;
EINT; // 使能全局中断
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断标志位
}
// PWM中断服务函数
interrupt void Epwm1Isr()
{
EPwm1Regs.ETCLR.bit.INT = 1; // 清除中断标志位
}
// 主函数
void main()
{
InitSysCtrl(); // 系统时钟初始化
InitGpio(); // GPIO初始化
InitEPwm1(); // PWM初始化
InitCpuTimer1(); // 定时器初始化
InitAdc(); // ADC初始化
IER |= M_INT1; // 使能中断
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 使能PWM中断
PieCtrlRegs.PIEIER1.bit.INTx6 = 1; // 使能定时器中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // 使能ADC中断
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断标志位
CpuTimer1Regs.TCR.bit.TSS = 0; // 启动定时器
EINT; // 使能全局中断
while(1)
{
// 程序主循环
}
}
```
以上程序中,初始化函数 `InitEPwm1()` 用于初始化PWM模块,包括设置PWM周期、计数器模式、时钟分频等;函数 `InitCpuTimer1()` 用于初始化定时器模块;函数 `InitAdc()` 用于初始化ADC模块;函数 `InitGpio()` 用于初始化GPIO模块。
中断服务函数 `AdcIsr()` 用于处理ADC转换完成后的中断事件;函数 `CpuTimer1Isr()` 用于处理定时器中断事件;函数 `Epwm1Isr()` 用于处理PWM中断事件。
在主函数中,我们调用以上初始化函数进行初始化,并使能中断。在程序主循环中,我们可以根据ADC采样值来控制机械手臂角度,具体实现方法可以根据具体需求进行编写。
阅读全文