This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/DRV8836:DDS 效率

Guru**** 2513185 points
Other Parts Discussed in Thread: DRV8836

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/596805/ccs-drv8836-dds-priciple

器件型号:DRV8836

工具/软件: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,因为电机不再旋转


提前感谢

此致
哈桑

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hassan、

    您能否将链接发布到您在中找到此代码的 wiki?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Phil、
    太棒了!
    processors.wiki.ti.com/.../MSP430StepperMotor
    我想真正理解它! 尤其是两个信号之间的90°偏移
    提前感谢
    此致
    哈桑
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bodache、
    调用该中断的速度比 PWM 输出的频率快得多。 它会等待计数器变量超过特定值、然后遍历数组中的下一步配置。 您将注意到、每个数组元素都有2个引脚、每次只有一个引脚发生变化。

    因此、每次在 old_phaseacc 或 s_stepader_phase累 加器中设置0x8000位时、步进位置(步进模式数组的索引)都会递增。 然后清除 APH 和 BPH 输出并将其设置为相同行(#102)上的新步进模式、您将注意到索引与0x3进行了"与"运算、以防止索引溢出。

    请告诉我这是否回答了您的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Cameron、

    很抱歉我迟到了。 我在国外
    解释的很好。
    我试图了解步进电机的速度、但我无法确定步进电机的速度。 因为设备丢失。
    另一个问题是:标题"STEPPER .h"中折页代码部分中的频率与十进制数之间的关系如何。
    *用指定的步进量旋转步进。 "count"的符号指定方向。
    *速度设置旋转速度:
    * 32767 = 10kHz
    * 3268 = 1kHz
    * 327 = 100Hz
    * 32 = 10Hz
    * 3 = 1Hz
    *所有中间的值都是可能的,关系是线性的
    *
    *旋转函数也会启用驱动器级
    *
    *即使电机旋转未完成(=异步),此函数也会返回*/


    提前感谢您
    哈桑