📄 bldcm.lst
字号:
__start:
__text_start:
001A EFCF LDI R28,0xFF
001B E0D2 LDI R29,2
001C BFCD OUT 0x3D,R28
001D BFDE OUT 0x3E,R29
001E 51C0 SUBI R28,0x10
001F 40D0 SBCI R29,0
0020 EA0A LDI R16,0xAA
0021 8308 STD Y+0,R16
0022 2400 CLR R0
0023 E0E0 LDI R30,0
0024 E0F1 LDI R31,1
0025 E011 LDI R17,1
0026 30E0 CPI R30,0
0027 07F1 CPC R31,R17
0028 F011 BEQ 0x002B
0029 9201 ST R0,Z+
002A CFFB RJMP 0x0026
002B 8300 STD Z+0,R16
002C E3E4 LDI R30,0x34
002D E0F0 LDI R31,0
002E E0A0 LDI R26,0
002F E0B1 LDI R27,1
0030 E010 LDI R17,0
0031 33E4 CPI R30,0x34
0032 07F1 CPC R31,R17
0033 F021 BEQ 0x0038
0034 95C8 LPM
0035 9631 ADIW R30,1
0036 920D ST R0,X+
0037 CFF9 RJMP 0x0031
0038 D0B7 RCALL _main
_exit:
0039 CFFF RJMP _exit
FILE: F:\avrprojs\bldcm\bldcmmain.c
(0001) //********************************************************///////////////
(0002) ///**purpose: use PWM to control BLDCM**********/////
(0003) ///***data: 2008.8.20***********///
(0004) ///***author: XieZu Su********//////
(0005) #include <iom48v.h>
(0006) #include <macros.h>
(0007) #define speed0 0x20
(0008)
(0009) void port_init(void)
(0010) {
(0011) PORTB = 0x00; //PB1~PB3输出,对应3个下桥臂的通断
_port_init:
003A 2422 CLR R2
003B B825 OUT 0x05,R2
(0012) DDRB = 0x0E;
003C E08E LDI R24,0xE
003D B984 OUT 0x04,R24
(0013) PORTC = 0x07; //PC0,PC1,PC2霍尔位置传感器输入,上拉
003E E087 LDI R24,7
003F B988 OUT 0x08,R24
(0014) DDRC = 0x00;
0040 B827 OUT 0x07,R2
(0015) PORTD = 0x00;
0041 B82B OUT 0x0B,R2
(0016) DDRD = 0x68; //PD6 PD5 PD3分别对应上桥臂的通断信号PWM
0042 E688 LDI R24,0x68
0043 B98A OUT 0x0A,R24
0044 9508 RET
(0017) }
(0018)
(0019)
(0020)
(0021) void timer0_init(void)
(0022) {
(0023) //TCCR0B = 0x00; //stop
(0024) // TCNT0 = 0x01; //set count
(0025)
(0026) // TCCR0A = 0xA3; // 快速PWM
(0027) // TCCR0B = 0x01; //start timer 选择分频系数
(0028) // OCR0A = 0x30;
(0029) // OCR0B = 0x30;
(0030)
(0031) TCCR0B = 0x00; //stop
_timer0_init:
0045 2422 CLR R2
0046 BC25 OUT 0x25,R2
(0032) TCNT0 = 0x01; //set count
0047 E081 LDI R24,1
0048 BD86 OUT 0x26,R24
(0033) //TCCR0A = 0xa3; //CTC mode
(0034) //TCCR0B = 0x01; //start timer
(0035) OCR0A = speed0;
0049 E280 LDI R24,0x20
004A BD87 OUT 0x27,R24
(0036) OCR0B = speed0;
004B BD88 OUT 0x28,R24
004C 9508 RET
(0037) }
(0038)
(0039) void timer2_init(void)
(0040) {
(0041)
(0042) TCCR2B = 0x00; //stop
_timer2_init:
004D 2422 CLR R2
004E 922000B1 STS 0xB1,R2
(0043) ASSR = 0x00; //set async mode
0050 922000B6 STS 0xB6,R2
(0044) TCNT2 = 0x01; //setup
0052 E081 LDI R24,1
0053 938000B2 STS 0xB2,R24
(0045) OCR2A = speed0;
0055 E280 LDI R24,0x20
0056 938000B3 STS 0xB3,R24
(0046) OCR2B = speed0;
0058 938000B4 STS 0xB4,R24
005A 9508 RET
(0047) }
(0048)
(0049) void Start_PWMAB(void)
(0050) {
(0051) TCCR0B = 0x00;
_Start_PWMAB:
005B 2422 CLR R2
005C BC25 OUT 0x25,R2
(0052) TCCR0A = 0xA3; //
005D EA83 LDI R24,0xA3
005E BD84 OUT 0x24,R24
(0053) TCCR0B = 0x01; //start Timer
005F E081 LDI R24,1
0060 BD85 OUT 0x25,R24
0061 9508 RET
(0054) }
(0055)
(0056) void Start_PWMA_Close_PWMB(void)
(0057) {
(0058) TCCR0B = 0x00;
_Start_PWMA_Close_PWMB:
0062 2422 CLR R2
0063 BC25 OUT 0x25,R2
(0059) TCCR0A = 0x83; //
0064 E883 LDI R24,0x83
0065 BD84 OUT 0x24,R24
(0060) TCCR0B = 0x01; //start Timer
0066 E081 LDI R24,1
0067 BD85 OUT 0x25,R24
0068 9508 RET
(0061) }
(0062)
(0063) void Start_PWMB_Close_PWMA(void)
(0064) {
(0065) TCCR0B = 0x00;
_Start_PWMB_Close_PWMA:
0069 2422 CLR R2
006A BC25 OUT 0x25,R2
(0066) TCCR0A = 0x23; //
006B E283 LDI R24,0x23
006C BD84 OUT 0x24,R24
(0067) TCCR0B = 0x01; //start Timer
006D E081 LDI R24,1
006E BD85 OUT 0x25,R24
006F 9508 RET
(0068) }
(0069)
(0070) void Shut_PWMAB(void)
(0071) {
(0072) TCCR0B = 0x00;
_Shut_PWMAB:
0070 2422 CLR R2
0071 BC25 OUT 0x25,R2
(0073) TCCR0A = 0x02;
0072 E082 LDI R24,2
0073 BD84 OUT 0x24,R24
0074 9508 RET
(0074) }
(0075)
(0076) void Start_PWMC(void)
(0077) {
(0078) TCCR2B = 0x00; //stop
_Start_PWMC:
0075 2422 CLR R2
0076 922000B1 STS 0xB1,R2
(0079) TCCR2A = 0x23;
0078 E283 LDI R24,0x23
0079 938000B0 STS 0xB0,R24
(0080) TCCR2B = 0x01; //start
007B E081 LDI R24,1
007C 938000B1 STS 0xB1,R24
007E 9508 RET
(0081) }
(0082)
(0083) void Shut_PWMC(void)
(0084) {
(0085) TCCR2B = 0x00; //stop
_Shut_PWMC:
007F 2422 CLR R2
0080 922000B1 STS 0xB1,R2
(0086) TCCR2A = 0x03;
0082 E083 LDI R24,3
0083 938000B0 STS 0xB0,R24
0085 9508 RET
(0087) }
(0088)
(0089) void phase_one_five(void)
(0090) {
(0091) PORTB = PORTB&0xF5; //关下桥臂4,6
_phase_one_five:
0086 B185 IN R24,0x05
0087 7F85 ANDI R24,0xF5
0088 B985 OUT 0x05,R24
(0092) Shut_PWMC(); //关上桥臂 3
0089 DFF5 RCALL _Shut_PWMC
(0093) Start_PWMA_Close_PWMB(); //关上桥臂2,开上桥臂1
008A DFD7 RCALL _Start_PWMA_Close_PWMB
(0094) PORTB = PORTB|0x04; //开下桥臂5
008B 9A2A SBI 0x05,2
008C 9508 RET
(0095) }
(0096)
(0097) void phase_one_six(void)
(0098) {
(0099) PORTB = PORTB&0xF9; //关下桥臂4,5
_phase_one_six:
008D B185 IN R24,0x05
008E 7F89 ANDI R24,0xF9
008F B985 OUT 0x05,R24
(0100) Shut_PWMC(); //关上桥臂 3
0090 DFEE RCALL _Shut_PWMC
(0101) Start_PWMA_Close_PWMB(); //关上桥臂2,开上桥臂1
0091 DFD0 RCALL _Start_PWMA_Close_PWMB
(0102) PORTB = PORTB|0x08; //开下桥臂6
0092 9A2B SBI 0x05,3
0093 9508 RET
(0103) }
(0104)
(0105) void phase_two_six(void)
(0106) {
(0107) PORTB = PORTB&0xF9; //关下桥臂4,5
_phase_two_six:
0094 B185 IN R24,0x05
0095 7F89 ANDI R24,0xF9
0096 B985 OUT 0x05,R24
(0108) Shut_PWMC(); //关上桥臂 3
0097 DFE7 RCALL _Shut_PWMC
(0109) Start_PWMB_Close_PWMA(); //关上桥臂1,开上桥臂2
0098 DFD0 RCALL _Start_PWMB_Close_PWMA
(0110) PORTB = PORTB|0x08; //开下桥臂6
0099 9A2B SBI 0x05,3
009A 9508 RET
(0111) }
(0112)
(0113) void phase_two_four(void)
(0114) {
(0115) PORTB = PORTB&0xF3; //关下桥臂4,6
_phase_two_four:
009B B185 IN R24,0x05
009C 7F83 ANDI R24,0xF3
009D B985 OUT 0x05,R24
(0116) Shut_PWMC(); //关上桥臂 3
009E DFE0 RCALL _Shut_PWMC
(0117) Start_PWMB_Close_PWMA(); //关上桥臂1,开上桥臂2
009F DFC9 RCALL _Start_PWMB_Close_PWMA
(0118) PORTB = PORTB|0x02; //开下桥臂4
00A0 9A29 SBI 0x05,1
00A1 9508 RET
(0119) }
(0120)
(0121) void phase_three_four(void)
(0122) {
(0123) PORTB = PORTB&0xF3; //关下桥臂6,5
_phase_three_four:
00A2 B185 IN R24,0x05
00A3 7F83 ANDI R24,0xF3
00A4 B985 OUT 0x05,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -