工具/软件:Code Composer Studio
您好、admin 先生、
我现在正在学习如何使用 DDS 原理生成 PWM 信号。
我在 TI wiki 上找到 了一个由 Kai Gossner 编辑的 DRV8836固件。 该冰箱生成两个 PWM 信号、其中一个信号转换为90°、这正是我想要的。 但我并不真正理解它是如何工作的。 请向我解释一下它的工作原理。 更精确地说、定时器中断发生了什么?代码 如下:
/*
*步进.c
*
作者:Kai Gossner
*
#include
#include "beder.h"
/*连接 APH 引脚的端口2的位号*/
#define STEPADER_APH (1)
/*连接 BPH 引脚的端口2的位号*/
#define STEPADER_BPH (4)
/*连接 AEN 引脚的端口2的位号*/
#define STEPATER_AEN (0)
/*连接 Ben 引脚的端口2的位号*/
#define STEPADER_BEN (3)
/*用于驱动步进电机的灰码模式*/
静态常量 uint8_t s_step_pattern[4]={(<STEPPER_APH) | (0<<STEPPER_BPH),
(1<<STEPPER_APH) | (1<<STEPPER_BPH),
(0<<STEPPER_APH) | (1<<STEPPER_BPH),
(0<<STEPPER_APH) | (0<<STEPPER_BPH) };
静态易失性 uint16_t s_STEPER_PHase累 加器= 0;
静态易失性 uint16_t s_STEPER_PHASADDER = 0;
静态易失性 uint32_t s_STEPER_POSITION = 0;
静态 INT8_t s_STEPER_DIRECTION = 1;/*+1 = CW、-1 = CCV*/
静态易失性 uint32_t s_STEPPER = 0;
void STEPPER 初始化(void)
{
TACTL = tassel_2 + MC_1 + TAIE;// SMCLK、contmode、中断
TACCR0 = 100-1;//设置计时器每100us 溢出一次
_BIS_SR (GIE);//输入 LPM0、带中断
/*将所有步进控制引脚设置为输出和低电平*/
P2OUT = P2OUT &~((1<<STEPPER_AEN) | (1<<STEPPER_BEN) | (1<<STEPPER_APH) | (1<<STEPPER_BPH));
P2DIR |=(1<<STEPPER_AEN) | (1<<STEPPER_BEN) | (1<<STEPPER_APH) | (1<<STEPPER_BPH);
}
void STEPPER 驱动器_off (void)
{
P2OUT = P2OUT &~((1<<STEPPER_AEN) | (1<<STEPPER_BEN));
}
void STEPPER 驱动器_ON (void)
{
P2OUT = P2OUT |((1<<STEPPER_AEN) | (1<<STEPPER_BEN));
}
void STEPATER_rotate (int32_t 计数、uint16_t 速度)
{
STEPER_DRIVER_ON();
如果(计数> 0)
S_STEPDIRECT_DIRECTION = 1;
其他
{
S_STEPDIRECT_DIRECTION =-1;
count =-count;
}
S_STEPADER_COUNT =计数;
S_STEPADER_PHASADDER =速度;
TACTL |= TAIE;//打开计时器 ISR 以旋转电机
}
bool STEPPER 是否为旋转(void)
{
返回(TACTL & TAIE)!= 0;
}
// Timer_A3中断矢量(TA0IV)处理程序
//该 ISR 每1ms 调用一次,将驱动步进电机
#pragma vector=TIMER0_A1_vector
_interrupt void Timer_A (void)
{
静态 uint16_t old_phaseacc;
old_phaseacc = s_STEPER_phase累 加器;
TA0IV;
S_STEPADER_PHase累 加器+= s_STEPER_PHASADDER;
if ((old_phaseacc ^ s_tEPER_phaseaccumulator)& 0x8000)//检查最高位是否已过载
{
S_STEPDIER_POSITION += s_STEPER_DIRECTION;
P2OUT =(P2OUT &(~((<STEPPER_APH) | (1<<STEPPER_BPH)))) | s_step_pattern[s_stepper_position & 0x03];
S_STEPPER 计数--;
如果(s_STEPADER_COUNT = 0)
{
TACTL &=~TAIE;//关闭定时器 ISR,因为电机不再旋转
}
}
}
提前感谢
此致
哈桑