⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bldcm.lst

📁 三相无刷电机的PWM控制
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -