所以我正在尝试完成我的实验室任务,并通过将我的引脚设置为脉冲来不断遇到这个问题。我想在 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