0

所以我正在尝试完成我的实验室任务,并通过将我的引脚设置为脉冲来不断遇到这个问题。我想在 PWM 模式下使用两个定时器来生成正弦波来驱动我的电机。我需要让计时器一次闪烁一个端口'(OCR * A)',然后在另一个'(OCR * B)'再次闪烁并将计数器重置为零。

我不太在意端口上的哪个引脚闪烁,只要我可以控制 OCR*A 和 OCR*B 之间的差异,例如,我可以在一个中获得 70% 的功率,在另一个中获得 30% 的功率。我想要两个定时器,所以我有独立的电机控制,但如果我可以用一个定时器来做也可以,只要电机可以设置为不同的占空比。

最后一个问题,我所有的代码都必须是汇编代码。我不希望你为我编写代码,但我一遍又一遍地阅读我的手册,并且对我如何将计时器设置错误感到困惑。

这是我到目前为止的代码。我的代码编写方式我认为它应该闪烁 OCR2A 和 OCR0A 但我不确定。请让我知道并再次感谢您。

    .INCLUDE <m48Pdef.inc>; Include in program 



    .CSEG; Start code segment. 

    .ORG 0x0000

RJMP MAIN

    MAIN:
LDI R16, LOW(RAMEND)
OUT SPL, R16
LDI R16, HIGH(RAMEND)
OUT SPH, R16

SBI DDRD, 3     ; set correct pins to read and write
SBI DDRD, 2
SBI DDRD, 1
SBI DDRD, 0
SBI DDRB, 3     ; set correct pins to read and write
SBI DDRB, 2
SBI DDRB, 1
SBI DDRB, 0


CLR R16
CLR R17
CLI ;clear global interrupts


LDI R16, 0b01000011 
STS 0xB0, R16
LDI R16, 0b00001011 
STS 0xB1, R16

CLI


LDI R17, 0b01000011 
STS 0x44, R17
LDI R17, 0b00001011 
STS 0x45, R17


LDI R19, 7
LDI R18, 3

SEI

    LOOP:

RCALL DelayA
STS OCR2A, R18
STS OCR0A, R18
STS OCR2B, R19
STS OCR0B, R19
LDI R20, 0xFF
LDI R22, 0x00
LDI R23, 0x00
RCALL DelayA
RJMP LOOP       ;repeats loop to keep the output going

    DelayA:
CP r20, r22 ;standard double nested delay loop
BREQ RELOOP
NOP
NOP
NOP
Dec r20
ldi r21, 0xFF
RJMP DelayB

    DelayB:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CP r21, r22
BREQ DelayA
Dec r21
RJMP DelayB

    RELOOP:
RET

4

1 回答 1

0

我不是 ARV 组装方面的专家,但以下是我看到的问题:

  • 您正在STS尝试将数据加载到定时器寄存器中,但您需要使用的是OUT指令。STS是“直接存储到 SRAM”:定时器控制寄存器是......好吧......寄存器,并通过out指令加载。TIMER1数据表第 114 页上有一个装配示例。
  • 在设置 reneral 用途寄存器中的位并将它们加载到定时器控制寄存器之前,您可能希望确保寄存器中不包含任何内容。例如,使用该LDI指令。可能有更好的方法将寄存器归零,所以谷歌(就像我说的,我在 AVR 汇编中没有太多编程)
  • 一般来说,请阅读数据表:我在您所做的事情中没有看到任何 PWM 设置说明。

要让 PWM 在 AVR 上工作,您需要担心的寄存器是:

  • 加载TCCR_A设置要连接到定时器的引脚的位。例如,COM0A_位允许OC0A自动对引脚进行 PWM,而COM0B_位允许对引脚OC0B进行 PWM(数据表第 104-105 页)。
  • 两者TCCR_A和都TCCR_B必须WGM__正确设置位以指定波形生成模式。您很可能需要一种快速 PWM 模式。
  • TCCR_B还通过预分频器CS__位指定 PWM 的频率。频率将是 CPU 时钟速度除以某个因子(预分频器值为 1 为最快)。有关 TIMER0,请参见数据表第 108 页。
  • 最后OCR_A和寄存器分别设置和引脚OCR_B的占空比。在非反相 PWM 模式下,相应的引脚设置为 BOTTOM,然后在(定时器计数器)达到/中的值时清零。因此,如果您在定时器 0 上进行快速 PWM 并在非反相模式下连接到定时器输出(位已设置,位已清零),则 in的值将为您提供 25% 的引脚占空比(如果您的定时器预分频器位大于(0=定时器停止)且小于(位指定外部时钟源)。OC_AOC_BTCNTOC_AOC_BOC0ACOM0A1COM0A0TCCR0A0x3FOCR01OC0A00x060x060x07CS0_
  • 您不需要中断或溢出。假设您正确设置了上述寄存器,ATmega 将为您进行 PWM。
于 2013-04-14T05:17:12.823 回答