📄 main.lss
字号:
// 初始化PWM //
//==============================================================//
//TCCR1A 7 6 5 4 3 2 1 0//
// 7:6通道A比较输出模式 快速PWM模式 00普通断口 01取反 10匹配清零输出TOP恢复 11。。。
// 5:4通道B比较输出模式
// 3:2AB通道强制匹配输出
// 1:0 WGM11 WGM10 控制序列与TCCR1B中的 3:2 组合
//模式 WGM13 WGM12 WGM11 WGM10 定时器/计数器工作模式 计数器上限TOP //
//0 0 0 0 0 普通模式 0XFFFF
//1 0 0 0 1 8位相位修正PWM 0XFF
//2 0 1 0 0 TCT OCR1A
// 0 1 0 1 8位快速PWM 0XFF
// 1 1 1 0 快速PWM ICR1
TCCR1A=226;//242; //AB输出方式为匹配拉高 非匹配强制方式 快速PWM方式ICR1定义方式
18a: 82 ee ldi r24, 0xE2 ; 226
18c: 80 93 80 00 sts 0x0080, r24
TCCR1B=25; //AB输出工作于快速PWM方式ICR1定义 时钟源S/1
190: 89 e1 ldi r24, 0x19 ; 25
192: 80 93 81 00 sts 0x0081, r24
ICR1=80; //定义TOP数值 80=100KHZ 效率达到98%
196: 80 e5 ldi r24, 0x50 ; 80
198: 90 e0 ldi r25, 0x00 ; 0
19a: 90 93 87 00 sts 0x0087, r25
19e: 80 93 86 00 sts 0x0086, r24
OCR1A=80;//l40 80=0
1a2: 90 93 89 00 sts 0x0089, r25
1a6: 80 93 88 00 sts 0x0088, r24
OCR1B=0;//h38 0=0
1aa: 10 92 8b 00 sts 0x008B, r1
1ae: 10 92 8a 00 sts 0x008A, r1
//===================//初始化AD转换器
ADMUX=0B11000000; //AD工作于1.1V基准电压状态 同时设定AD0状态 数据是右对齐方式
1b2: 80 ec ldi r24, 0xC0 ; 192
1b4: 80 93 7c 00 sts 0x007C, r24
//BIT 4-0 决定选择的AD位 0-7 代表AD0-AD7
ADCSRA=0B11000010; //启动AD,进入转换方式 工作于非中断方式 分频为S/4
1b8: 82 ec ldi r24, 0xC2 ; 194
1ba: 80 93 7a 00 sts 0x007A, r24
//BIT6为转换完成标志 通过查询而进行读取 写1开始进行转换 变成0标志完成转变
//BIT4为转换完成标志 通过查询而进行读取 变成1表示完成变换 须用软件写1来完成清除标志
//初始化定时器T2
//=======================================================//
// TCCR2=7; //T2 1024分频
// TCNT0=55; // 1/20s
// TIMSK=1<<6; //准许T2中断bit6
/*
//初始化
UCSRB=216; //允许串口发送和接收,并响应接收完成中断
UBRRL= 103; //设置串口波特率为4800
UCSRC= ((1<<URSEL)+(1<<UCSZ1)+(1<<UCSZ0)); //帧结构为8位数据+1位stop位
*/
//初始化T0
TCCR0B=5; //TO 1024分频
1be: 85 e0 ldi r24, 0x05 ; 5
1c0: 85 bd out 0x25, r24 ; 37
TCNT0=78; //
1c2: 8e e4 ldi r24, 0x4E ; 78
1c4: 86 bd out 0x26, r24 ; 38
TIMSK0|=1; //准许TO中断
1c6: 80 91 6e 00 lds r24, 0x006E
1ca: 81 60 ori r24, 0x01 ; 1
1cc: 80 93 6e 00 sts 0x006E, r24
SREG|=1<<7;
1d0: 8f b7 in r24, 0x3f ; 63
1d2: 80 68 ori r24, 0x80 ; 128
1d4: 8f bf out 0x3f, r24 ; 63
1d6: 08 95 ret
000001d8 <pwmjia>:
}
unsigned int ADDATA[5];
void pwmjia(void)
{
if(OCR1B<75)
1d8: 80 91 8a 00 lds r24, 0x008A
1dc: 90 91 8b 00 lds r25, 0x008B
1e0: 8b 34 cpi r24, 0x4B ; 75
1e2: 91 05 cpc r25, r1
1e4: 30 f4 brcc .+12 ; 0x1f2 <pwmjia+0x1a>
OCR1B+=1;
1e6: 80 91 8a 00 lds r24, 0x008A
1ea: 90 91 8b 00 lds r25, 0x008B
1ee: 01 96 adiw r24, 0x01 ; 1
1f0: 02 c0 rjmp .+4 ; 0x1f6 <pwmjia+0x1e>
else
OCR1B=75;
1f2: 8b e4 ldi r24, 0x4B ; 75
1f4: 90 e0 ldi r25, 0x00 ; 0
1f6: 90 93 8b 00 sts 0x008B, r25
1fa: 80 93 8a 00 sts 0x008A, r24
if(OCR1B>10)
1fe: 80 91 8a 00 lds r24, 0x008A
202: 90 91 8b 00 lds r25, 0x008B
206: 0b 97 sbiw r24, 0x0b ; 11
208: 30 f0 brcs .+12 ; 0x216 <pwmjia+0x3e>
OCR1A=OCR1B+2;
20a: 80 91 8a 00 lds r24, 0x008A
20e: 90 91 8b 00 lds r25, 0x008B
212: 02 96 adiw r24, 0x02 ; 2
214: 02 c0 rjmp .+4 ; 0x21a <pwmjia+0x42>
else
OCR1A=80;//禁止同步整流
216: 80 e5 ldi r24, 0x50 ; 80
218: 90 e0 ldi r25, 0x00 ; 0
21a: 90 93 89 00 sts 0x0089, r25
21e: 80 93 88 00 sts 0x0088, r24
222: 08 95 ret
00000224 <pwmjian>:
}
void pwmjian(void)
{
if(OCR1B>4)
224: 80 91 8a 00 lds r24, 0x008A
228: 90 91 8b 00 lds r25, 0x008B
22c: 05 97 sbiw r24, 0x05 ; 5
22e: 50 f0 brcs .+20 ; 0x244 <pwmjian+0x20>
OCR1B-=1;
230: 80 91 8a 00 lds r24, 0x008A
234: 90 91 8b 00 lds r25, 0x008B
238: 01 97 sbiw r24, 0x01 ; 1
23a: 90 93 8b 00 sts 0x008B, r25
23e: 80 93 8a 00 sts 0x008A, r24
242: 04 c0 rjmp .+8 ; 0x24c <pwmjian+0x28>
else
OCR1B=0;
244: 10 92 8b 00 sts 0x008B, r1
248: 10 92 8a 00 sts 0x008A, r1
if(OCR1B>10)
24c: 80 91 8a 00 lds r24, 0x008A
250: 90 91 8b 00 lds r25, 0x008B
254: 0b 97 sbiw r24, 0x0b ; 11
256: 30 f0 brcs .+12 ; 0x264 <pwmjian+0x40>
OCR1A=OCR1B+2;
258: 80 91 8a 00 lds r24, 0x008A
25c: 90 91 8b 00 lds r25, 0x008B
260: 02 96 adiw r24, 0x02 ; 2
262: 02 c0 rjmp .+4 ; 0x268 <pwmjian+0x44>
else
OCR1A=80;//禁止同步整流
264: 80 e5 ldi r24, 0x50 ; 80
266: 90 e0 ldi r25, 0x00 ; 0
268: 90 93 89 00 sts 0x0089, r25
26c: 80 93 88 00 sts 0x0088, r24
270: 08 95 ret
00000272 <shan>:
}
unsigned char shan1=0;
void shan(unsigned char x1,unsigned char x2)//闪烁次数 闪烁间隔总长度
{
272: 28 2f mov r18, r24
shan1+=1;
274: 80 91 14 01 lds r24, 0x0114
278: 8f 5f subi r24, 0xFF ; 255
27a: 80 93 14 01 sts 0x0114, r24
if(shan1>=x2)
27e: 86 17 cp r24, r22
280: 10 f0 brcs .+4 ; 0x286 <shan+0x14>
{shan1=0;
282: 10 92 14 01 sts 0x0114, r1
286: 80 91 14 01 lds r24, 0x0114
}
if(x1==1) //闪烁一次
28a: 21 30 cpi r18, 0x01 ; 1
28c: 19 f4 brne .+6 ; 0x294 <shan+0x22>
{
if(shan1==2)
28e: 82 30 cpi r24, 0x02 ; 2
290: 29 f0 breq .+10 ; 0x29c <shan+0x2a>
292: 06 c0 rjmp .+12 ; 0x2a0 <shan+0x2e>
PORTD|=16;
else
PORTD&=255-16;
}
else
{
if(shan1==2||shan1==4)
294: 82 30 cpi r24, 0x02 ; 2
296: 11 f0 breq .+4 ; 0x29c <shan+0x2a>
298: 84 30 cpi r24, 0x04 ; 4
29a: 11 f4 brne .+4 ; 0x2a0 <shan+0x2e>
{
PORTD|=16;
29c: 5c 9a sbi 0x0b, 4 ; 11
29e: 08 95 ret
}
else
{
PORTD&=255-16;
2a0: 5c 98 cbi 0x0b, 4 ; 11
2a2: 08 95 ret
000002a4 <fudian>:
}
}
}
int fudian(unsigned int x)
{
2a4: 0f 93 push r16
2a6: 1f 93 push r17
2a8: 8c 01 movw r16, r24
return x*37.236;
2aa: c8 01 movw r24, r16
2ac: aa 27 eor r26, r26
2ae: 97 fd sbrc r25, 7
2b0: a0 95 com r26
2b2: ba 2f mov r27, r26
2b4: bc 01 movw r22, r24
2b6: cd 01 movw r24, r26
2b8: 09 d2 rcall .+1042 ; 0x6cc <__floatsisf>
2ba: 17 ff sbrs r17, 7
2bc: 05 c0 rjmp .+10 ; 0x2c8 <fudian+0x24>
2be: 20 e0 ldi r18, 0x00 ; 0
2c0: 30 e0 ldi r19, 0x00 ; 0
2c2: 40 e8 ldi r20, 0x80 ; 128
2c4: 57 e4 ldi r21, 0x47 ; 71
2c6: a3 d1 rcall .+838 ; 0x60e <__addsf3>
2c8: 2a ea ldi r18, 0xAA ; 170
2ca: 31 ef ldi r19, 0xF1 ; 241
2cc: 44 e1 ldi r20, 0x14 ; 20
2ce: 52 e4 ldi r21, 0x42 ; 66
2d0: 52 d2 rcall .+1188 ; 0x776 <__mulsf3>
2d2: dc 01 movw r26, r24
2d4: cb 01 movw r24, r22
2d6: bc 01 movw r22, r24
2d8: cd 01 movw r24, r26
2da: db d1 rcall .+950 ; 0x692 <__fixsfsi>
2dc: dc 01 movw r26, r24
2de: cb 01 movw r24, r22
2e0: 1f 91 pop r17
2e2: 0f 91 pop r16
2e4: 08 95 ret
000002e6 <fuwei>:
}
unsigned int setvin=210;//原始电压点 从EEPROM中来数据
unsigned int dianyain=210;//跟踪电压点
unsigned int jiange=0,yuandian1i=0,jianhoui=0,jiahoui=0,yuandian2i=0;
//采样总时间控制 原点电流 -。5电流 加0。5V电压后的电流 原点2电流
unsigned char jieduan=0,jieduan1=0,jieduan2=0,jieduan3=0,jieduan4=0;
//先采样原点电流 然后采样减电压后的电流 然后采样加电压后的电流 然后再采样原点电流 处理这些电流数据
//复位函数 功能恢复间隔跟踪 间隔一定时间后再次启动跟踪
void fuwei(void)
{
jiange=0;
2e6: 10 92 13 01 sts 0x0113, r1
2ea: 10 92 12 01 sts 0x0112, r1
jieduan=0;
2ee: 10 92 09 01 sts 0x0109, r1
yuandian1i=0;
2f2: 10 92 11 01 sts 0x0111, r1
2f6: 10 92 10 01 sts 0x0110, r1
yuandian2i=0;
2fa: 10 92 0b 01 sts 0x010B, r1
2fe: 10 92 0a 01 sts 0x010A, r1
jiahoui=0;
302: 10 92 0d 01 sts 0x010D, r1
306: 10 92 0c 01 sts 0x010C, r1
jianhoui=0;
30a: 10 92 0f 01 sts 0x010F, r1
30e: 10 92 0e 01 sts 0x010E, r1
jieduan4=0;
312: 10 92 05 01 sts 0x0105, r1
316: 08 95 ret
00000318 <chuligz>:
}
//处理跟踪得到的结果 跟踪数据得到最终处理
void chuligz(void)
{
if((jiahoui>jianhoui)&&(jiahoui>yuandian1i))
318: 20 91 0c 01 lds r18, 0x010C
31c: 30 91 0d 01 lds r19, 0x010D
320: 40 91 0e 01 lds r20, 0x010E
324: 50 91 0f 01 lds r21, 0x010F
328: 42 17 cp r20, r18
32a: 53 07 cpc r21, r19
32c: 68 f4 brcc .+26 ; 0x348 <chuligz+0x30>
32e: 80 91 10 01 lds r24, 0x0110
332: 90 91 11 01 lds r25, 0x0111
336: 82 17 cp r24, r18
338: 93 07 cpc r25, r19
33a: 30 f4 brcc .+12 ; 0x348 <chuligz+0x30>
{//加跟踪成功
dianyain+=8;
33c: 80 91 00 01 lds r24, 0x0100
340: 90 91 01 01 lds r25, 0x0101
344: 08 96 adiw r24, 0x08 ; 8
346: 0f c0 rjmp .+30 ; 0x366 <chuligz+0x4e>
fuwei();
jiange=300;//直接等待1S后再次启动跟踪
}
else
{
if((jianhoui>jiahoui)&&(jianhoui>yuandian1i))
348: 24 17 cp r18, r20
34a: 35 07 cpc r19, r21
34c: c0 f4 brcc .+48 ; 0x37e <chuligz+0x66>
34e: 80 91 10 01 lds r24, 0x0110
352: 90 91 11 01 lds r25, 0x0111
356: 84 17 cp r24, r20
358: 95 07 cpc r25, r21
35a: 88 f4 brcc .+34 ; 0x37e <chuligz+0x66>
{//减跟踪成功
dianyain-=8;
35c: 80 91 00 01 lds r24, 0x0100
360: 90 91 01 01 lds r25, 0x0101
364: 08 97 sbiw r24, 0x08 ; 8
366: 90 93 01 01 sts 0x0101, r25
36a: 80 93 00 01 sts 0x0100, r24
fuwei();
36e: bb df rcall .-138 ; 0x2e6 <fuwei>
jiange=300;//直接等待1S后再次启动跟踪
370: 8c e2 ldi r24, 0x2C ; 44
372: 91 e0 ldi r25, 0x01 ; 1
374: 90 93 13 01 sts 0x0113, r25
378: 80 93 12 01 sts 0x0112, r24
37c: 08 95 ret
}
else
{//跟踪都没有成功 等待下次跟踪
fuwei();
37e: b3 df rcall .-154 ; 0x2e6 <fuwei>
380: 08 95 ret
00000382 <genzong>:
}
}
}
//跟踪主 程序 跟踪最大功率点功能
void genzong(void)
{
jiange+=1;
382: 80 91 12 01 lds r24, 0x0112
386: 90 91 13 01 lds r25, 0x0113
38a: 01 96 adiw r24, 0x01 ; 1
38c: 90 93 13 01 sts 0x0113, r25
390: 80 93 12 01 sts 0x0112, r24
if(jiange>600)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -