Hexo添加菜单与分类之二

想在hexo增加一个与categories或tags平行的类别,好增加菜单的索引肿么办呢?

以 hipaper 主题为例子,比如增加一个叫”fenlei”的类别与菜单,步骤如下:

1
2
3
hexo new page fenlei # 会生产 source/fenlei/index.md文件
vim source/fenlei/index.md

在source/fenlei/index.md文件头部增加如下内容
layout: “fenlei”
fenlei: “”

在 themes/hipaper/layout目录下增加 fenlei.ejs,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<div class="archives-wrap" style="margin: 0px;">
<div class="row">
<!-- Fenlei 云 -->
<div class="archives-tags-wrap">
<%
// 构建 fenlei 数据(仿照 site.tags 结构)
const fenleiData = {};
site.posts.forEach(post => {
if (post.fenlei) {
const fenleiList = Array.isArray(post.fenlei) ?
post.fenlei :
[post.fenlei];
fenleiList.forEach(f => {
const key = f.toString().trim();
if (key) {
if (!fenleiData[key]) {
fenleiData[key] = [];
}
fenleiData[key].push(post);
}
});
}
});
%>
<% if (Object.keys(fenleiData).length) { %>
<blockquote>
<% Object.keys(fenleiData).sort().forEach(fenlei => { %>
<a href="#<%= fenlei %>"
style="font-size: <%= Math.min(22, 14 + fenleiData[fenlei].length * 2) %>px;">
<%= fenlei %> (<%= fenleiData[fenlei].length %>)
</a>
<% }) %>
</blockquote>
<% } %>
</div>

<!-- Fenlei 文章列表 -->
<% Object.keys(fenleiData).sort().forEach(fenlei => { %>
<div class="archives-wrap">
<div class="archive-year-wrap" id="<%= fenlei %>">
<h1 class="archive-tag"><%= fenlei %></h1>
</div>
<div class="archives">
<% fenleiData[fenlei].sort((a, b) => b.date - a.date).forEach(post => { %>
<%- partial('_partial/archive-post', {post: post, index: true}) %>
<% if (post.subtitle && post.subtitle.length) { %>
<h3 class="post-subtitle">
<%- post.subtitle %>
</h3>
<% } %>
<% }) %>
</div>
</div>
<% }) %>
</div>
</div>

<style>
/* 保持与 tags 相同的样式 */
.archives-tags-wrap a {
margin-right: 15px;
line-height: 2;
display: inline-block;
}
</style>

编辑 themes/hipaper/config.yml文件,增加菜单
menu:
fenlei: fenlei

以后在撰写markdown文件里,文件头要增加 fenlei: “你的内容”

hugo 中的文章添加时间线2. hugo-shortcode-timeline的修改

上次说到采用hugo-shortcode-timeline在文章里加时间线,初衷是我为了写工作报告,可是发现在写作时,还要写from time,to time等,可是我只想显示当时的时间,如何办呢?于是想办法改了一下。步骤如下:

一. 在github上下载 hugo-shortcode-timeline
二. 把 hugo-shortcode-timeline目录 copy到当前hugo blog的themes目录下
三. 修改config.toml,把原来的指定主题语句改为

theme = [“你原来的主题名”,”hugo-shortcode-timeline”]

在 themes/hugo-shorcode-timeline/layouts/shortcodes/目录,把even.html 另存为report.html并修改如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
{{$duration := ""}}

{{$to := now }}
{{ if ne (.Get "date") ""}}
{{$to = time (.Get "date") }}
{{end}}

{{$enabledTime := ne (.Get "date") ""}}

{{if $enabledTime }}
{{$from := time (.Get "date") }}
{{$tmonths:= mul ($to.Sub $from).Hours 0.00136986301 }}
{{$months := mod $tmonths 12 }}
{{$years := math.Floor (div $tmonths 12)}}
{{$yearStr := "years"}}
{{if lt $years 2 }}{{$yearStr = "year"}}{{end}}
{{$monthStr := "months"}}
{{if lt $months 2 }}{{$monthStr = "month"}}{{end}}

{{$duration = ""}}
{{if gt $years 0 }}{{$duration = printf "%s %.0f %s" $duration $years $yearStr}}{{end}}
{{if gt $months 0 }}{{$duration = printf "%s %d %s" $duration $months $monthStr}}{{end}}
{{end}}

<div class="container">
<div class="content collapsible {{ if .Get "collapsed" }}collapsed{{ end }}">
<div class="title">{{$to.Year}}-{{$to.Month}}-{{$to.Day}}</div>
{{if $enabledTime }}
<div class="duration" {{ if eq .Ordinal 0 }} id="duration" {{ end }}>
{{ if ne .Ordinal 0 }} {{$duration}} {{ end }}
</div>
{{ end }}
<div class="body">{{.Inner}}</div>
</div>

<div class="date">
{{ if ne (.Get "date") ""}}
{{$to.Year}}<br>{{$to.Month}}-{{$to.Day}}
{{ else }}
Present
{{ end }}
</div>

</div>

{{ if and (eq (.Ordinal) 0) $enabledTime }}
<script>
function non0plural(number, name) {
if (number == 0) {
return "";
}
return number + " " + name + (number > 1 ? "s" : "");
}

function monthDiff(d1, d2) {
let months;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth();
months += d2.getMonth();
return months <= 0 ? 0 : months;
}

el = document.querySelector("#duration");
function refresh() {
const start = new Date({{.Get "from"}});
const now = new Date();

const total_months = monthDiff(start, now);
const months = total_months % 12;
const years = Math.floor((total_months) / 12);
el.innerHTML = non0plural(years, "year") + " " + non0plural(months, "month");
}
window.setInterval(refresh, 1*1000);
</script>
{{ end }}

那么在markdown文章中写报告则为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{{< timeline >}}

{{% report date="2023-06-20" %}}
蓝总有意初步试定一吨,但临时变卦想用更高倔强的钢,暂时我们还做不到。我们讨论一下是否调用二治的钢材生新送样?还要讨论二治给我们的价格
{{% /report %}}

{{% report date="2023-05-29" %}}
蓝总自己的结构己完成,参数可以,但什么时候生产还得看情况
{{% /report %}}

{{% report date="2023-05-17" %}}
客户测试完成,表示与我们的报告性能一致,这0.5米长样品做为质检留底
{{% /report %}}

{{% report date="2023-05-12" %}}
检测报告送达,并附上0.5米长的样品供客户测试
{{% /report %}}

{{% report date="2023-05-11" %}}
客户蓝总需要一个三百吨的螺纹钢才,但是需要我们提供检测报告

{{% /report %}}

{{< /timeline >}}

hugo 中的文章添加时间线1. hugo-shortcode-timeline

一. 在github上下载 hugo-shortcode-timeline
二. 把 hugo-shortcode-timeline目录下的文件,copyg到当前hugo blog的themes目录下对应的theme目录中。

比如当前场景是serif, 则把 hugo-shorcode-timeline下

assets目录中的文件 copy 到 hugo-serif-theme/assets下
layout/shortcodes/ 目录下的文件 copy 到 hugo-serif-theme/layout/shorcodes/目录下

三. 在 markdown文件中语法如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{{< timeline >}}

{{% event title="催客户试产" from="2023-06-20" to="2023-07-24" %}}
_工作描述:_ 蓝总有意初步试定一吨,但临时变卦想用更高倔强的钢,暂时我们还做不到,项目终止
{{% /event %}}

{{% event title="客户自己的结构状况" from="2023-05-29" to="2023-06-20" %}}
_工作描述:_ 蓝总自己的结构己完成,参数可以,但什么时候生产还得看情况
{{% /event %}}

{{% event title="客户检测确认" from="2023-05-17" to="2023-05-29" %}}
_工作描述:_ 客户测试完成,表示与我们的报告性能一致,这0.5米长样品做为质检留底。
{{% /event %}}

{{% event title="样品确认到达并确认测试" from="2023-05-12" to="2023-05-17" %}}
_工作描述:_ 检测报告送达,并附上0.5米长的样品供客户测试
{{% /event %}}

{{% event title="客户拜访" from="2023-05-11" to="2023-05-12" %}}
客户蓝总需要一个三百吨的螺纹钢才,但是需要我们提供检测报告

{{% /event %}}

{{< /timeline >}}

电机驱动的两种波形

一 方波控制

  1. 通过霍尔传感器获得电机转子的位置,然后跟据转子的位置在360度的电气周期内,进行六次转向(每60度换向一次)。每个换向位置电机输出物定方向的力,因此可以说方波控制的位置精度是电气60度。由于在这种方式控制下,电机的相电流波形接近方波,所以叫方波控制
    无刷电机方波控制
  2. 特点
    价格便宜,驱动器算法简单,开发难度低,开发成本低,硬件成本相对较低
    加减速简单粗暴,类似于猛踩油门,但也容易过冲
    匹配电机简单,对电机的相位,相电感,相电阻要求低

二 正统波控制

  1. 使用的是SVPWM波形,输出的是三相正弦波电压,电机相电流为正弦波电流,可以认为在一个电气周期内进行了多次的连续变化换向,无换相电流突变。显然,正弦波与方波相比,其转矩波动较小,电流谐波小,控制起来感觉较“细腻”。
    无刷电机正弦波控制
  2. 特点
    运行平稳,转矩波动小,运行效果顺畅,不易受负载变动而波动
    稳定可靠,使用寿命长(正弦波控制避免了产生尖峰电流的冲击,而方波控制易产生尖峰电流,对MOS管及电机进行竞击,影响了寿命。)
    安静,噪音小。电机运行时,方波控制可明显听到“吱吱吱”的电流声,弦波控制电流声极小。
    效率高。正弦波控制比方波控制电机的使用效率高,输出同等功率所需的电流更低。
    算法难度高,成本比方波控制相对高一点。

三 如何选择

  1. 对运行效果,性能,稳定可靠性没有太高要求,追求低成本的。选方波驱动器
  2. 要求运行效果好,稳定可靠,静音,耗电低,效率高的。选正弦波驱动器

晶闸管(可控硅)是怎么调节灯泡亮度的?

怎么控制一个灯泡的亮度呢?如果是直流电的话,给三极管PWM波选择控制它的亮度。但如果是交流电呢?

比如我们家里的220伏50赫兹的交流电,这时候用三极管显然是不合适的,因为交流电的电压一直在发生变化,三极管根本不能正常工作,还有就是交流电的电压太高,一般三极管也承受不了这么大的电压。

那有什么办法可以控制这个灯的亮度吗?当然有了,那就是晶闸管(可控硅),它是很重要的,交流控制器件,比如调节交流电的灯光亮度,调节电水壶水温,还有风扇无极调速,都可以用晶闸管实现。

接下来我们就来说一说晶闸管是怎么调节灯泡亮度的,在讲之前,我们需要先了解怎么控制晶闸管的开启和截止。

晶闸管

上图是一个普通的晶闸管,当我们给G极一个适当的电压,它就导通了,但是如果这时候把电压去掉,它不能截止,要想使它截止只需要把电源电压给去掉,利用晶闸管的这个特性,就可以把它用在交流电的灯光调节上。

晶闸管调光电路

上图是晶闸管的交流调光电路,我们只需要转动滑动变阻器就能调节灯泡的亮度,电源的波形,当交流电增加到A点时,经过变阻器R2和R1的分压,R2此时输出的电压恰好使晶闸管导通,此时灯泡就被点亮了,再往后,灯泡会一直亮,直到E点,交流电的电压降为零,晶闸管截止,灯泡又熄灭。

晶闸管调光电路波形

然后等到下一个A点来临,灯泡又被点亮,在这个过程中,小灯泡身上的波形是这样的,但由于交流电的频率很快,我们几乎看不到它的闪烁,如果我们想要灯泡亮度更高,可以把滑动变阻器R2往上调节,这样R2输出的电压会更大一些。

不等交流电到达A点,在B点晶闸管就导通了,然后和上述过程一样,等交流电到达E点晶闸管又会截止,以此往复,此时落在小灯泡身上的波形是这样的,可以看出它们的波形差不多,但是调节之后的导通时间明显比之前更长。

晶闸管调光电路波形

逆变器的工作原理简介

逆变器工作原理

  1. 逆变器是一种DC to AC的变压器,它其实与转化器是一种电压逆变的过程。转换器是将电网的交流电压转变为稳定的12V直流输出,而逆变器是将Adapter输出的12V直流电压转变为高频的高压交流电;两个部分同样都采用了用得比较多的脉宽调制(PWM)技术。其核心部分都是一个PWM集成控制器,Adapter用的是UC3842,逆变器则采用TL5001芯片。TL5001的工作电压范围3.6~40V,其内部设有一个误差放大器,一个调节器、振荡器、有死区控制的PWM发生器、低压保护回路及短路保护回路等。

  2. 输入接口部分:输入部分有3个信号,12V直流输入VIN、工作使能电压ENB及Panel电流控制信号DIM。VIN由Adapter提供,ENB电压由主板上的MCU提供,其值为0或3V,当ENB=0时,逆变器不工作,而ENB=3V时,逆变器处于正常工作状态;而DIM电压由主板提供,其变化范围在0~5V之间,将不同的DIM值反馈给PWM控制器反馈端,逆变器向负载提供的电流也将不同,DIM值越小,逆变器输出的电流就越大。

  3. 电压启动回路:ENB为高电平时,输出高压去点亮Panel的背光灯灯管。

  4. PWM控制器:有以下几个功能组成:内部参考电压、误差放大器、振荡器和PWM、过压保护、欠压保护、短路保护、输出晶体管

  5. 直流变换:由MOS开关管和储能电感组成电压变换电路,输入的脉冲经过推挽放大器放大后驱动MOS管做开关动作,使得直流电压对电感进行充放电,这样电感的另一端就能得到交流电压。

  6. LC振荡及输出回路:保证灯管启动需要的1600V电压,并在灯管启动以后将电压降至800V。

  7. 输出电压反馈:当负载工作时,反馈采样电压,起到稳定I逆变器电压输出的作用。

隔离与非隔离

隔离与非隔离的概念,及两者的主要特点。

1) 电源隔离与非隔离的概念

电源的隔离与非隔离,主要是针对开关电源而言,业内比较通用的看法是:

隔离电源是指电源的输入回路和输出回路之间没有直接的电气连接,输入和输出之间是绝缘的高阻态,没有电流回路。非隔离电源是指输入回路和输出回路之间有直接的电流回路,例如,输入和输出之间是共地的。

2)隔离电源与非隔离电源的优缺点

由上述概念可知,对于常用的电源拓扑而言,非隔离电源主要有:Buck、Boost、Buck-Boost等;而隔离电源主要有各种带隔离变压器的反激、正激、半桥、LLC等。结合常用的隔离与非隔离电源,我们从直观上就可得出它们的一些优缺点,两者的优缺点几乎是相反的。使用隔离或非隔离的电源,需了解实际项目对电源的需求是怎样的,但在此之前,可了解下隔离和非隔离电源的主要优缺点:

① 隔离模块的电磁抗干扰能力强,可靠性高,但成本高,效率差。

② 非隔离模块的结构很简单,成本低,效率高,安全性能差。

3)隔离与非隔离电源的应用场合

通过了解隔离与非隔离电源的优缺点可知,它们各有优势,对于一些常用的嵌入式供电选择,我们已可做成准确的判断:

① 系统前级的电源,为提高抗干扰性能,保证可靠性,一般用隔离电源。

② 电路板内的IC或部分电路供电,从性价比和体积出发,优先选用非隔离的方案。

③ 对安全有要求的场合, 涉及可能触电的场合,如需接市电的AC-DC,或医疗用的电源,为保证人身的安全,必须用隔离电源,有些场合还必须用加强隔离的电源。

④ 对于远程工业通信的供电,为有效降低地电势差和导线耦合干扰的影响,一般用隔离电源为每个通信节点单独供电。串行通信总线通过RS-232、RS-485和控制器局域网(CAN)等物理网络传送数据,这些相互连接的系统每个都配备有自己的电源,而且各系统之间往往间隔较远,因此,我们通常需要隔离电源进行电气隔离来确保系统的物理安全,且通过隔离切断接地回路,来保护系统免受瞬态高电压冲击,同时减少信号失真;对外的I/O端口,为保证系统的可靠运行,也建议对I/O端口做电源隔离。

4) 抗电强度

电源的隔离耐压在GB-4943国标中又叫抗电强度,这个GB-4943标准就是我们常说的信息类设备的安全标准,就是为了防止人员受到物理和电气伤害的国家标准,其中包括避免人受到电击伤害、物理伤害、爆炸等伤害。

开源电源的隔离变压器

变压器(Transformer)是利用电磁感应的原理来改变交流电压的装置,主要构件是初级线圈、次级线圈和铁芯(磁芯)。主要功能有:电压变换、电流变换、阻抗变换、隔离、稳压(磁饱和变压器)等。

隔离变压器是用来把电力从交流电源转移到一个特定的设备。在这里,电源设备与电源分离,同时考虑到安全措施。此外,它还可以阻隔电容,使一次绕组和二次绕组联动。变压器通过感应从一个绕组到另一个绕组的电能,基本上增加了从一个绕组到另一个绕组的能量电压水平。隔离变压器促进电流隔离,防止电击、电路之间的电力传输以及敏感和可接受的装置产生电噪声。隔离变压器被设计用来抵抗来自接地回路的干扰,并减少减少减少电容耦合的绕组。变压器在线圈绕组上使用未连接的线轴。绕组互相打伤,使绝缘层保持在中间。在所有情况下,它们都受到静电屏蔽的保护,静电屏蔽位于绕组之间,用于为敏感设备(如实验室设备、计算机和其他电子设备)供电。

1、通过变压器的匝数比,实现电压的改变。电压的改变和电流的改变遵循匝比方程,如式:
电压与匝比

2、它用来代替各种电路中的隔离。它们用于不同的行业,以满足不同的功能,而不降低或增加电流。它有助于以1:1的比例分离一次绕组和二次绕组。

3、它减轻了触电的危险。电力变压器是定制的,以提供人与资源的分离,确保安全。它把船和电源连接起来。在这种情况下,电源线不与电动翼连接。

4、它能减少噪音和其他声音。它可以防止由于将音频放大器信号与扬声器输出直接连接并将音频放大器与放大器模块分离而产生的任何噪声。

5、它促进了直流电源的隔离。这些通常用于定期放大数字信息的电话线。变压器将直流电与控制放大器的信号分开。