简介:本资源是一份面向机械类本科生的《机械原理》课程大作业专项材料,聚焦凸轮机构的设计与分析核心内容,适用于课程设计、期末大作业及工程实践参考。资源为单个Word文档(.doc),大小363KB,内容完整覆盖偏置直动滚子推杆盘形凸轮的设计全流程:包含4-A/B/C三组具体题号参数(如基圆半径r0、偏距e、滚子半径rr、升程h及各段凸轮转角)、五次多项式推程与余弦加速度回程的数学建模、VB编程实现的核心代码(含运动方程、理论廓线与实际廓线计算逻辑)及关键变量说明。文档结构清晰,兼具理论推导、程序实现与参数验证,可直接用于作业提交或拓展学习。目前已有900人学习下载,是掌握凸轮运动规律、编程辅助设计及CAD建模前理论准备的实用型教学资料。
1. 凸轮轮廓不是“画出来”的,而是被运动学约束反推出来的:为什么 VB 程序里要同时算理论轮廓和实际轮廓,且二者差值直接决定机构是否失效?
你可能已经用 CAD 拉过几条样条曲线,以为凸轮就是“把位移曲线转成极坐标再描点连线”——但这份基于 VB 的机械原理大作业,用 360 行混杂着Sin(u * k)、Sqr(dxu ^ 2 + dyu ^ 2)和rg * co的代码,暴露了一个被教科书轻描淡写的残酷事实:凸轮的轮廓根本不是设计者“想画成什么样就什么样”,而是被滚子半径、偏置距、运动规律三重微分约束死的隐函数解。它不满足几何自由度,只服从运动学相容性。推程用五次多项式(保证加加速度连续),回程用余弦加速度(即简谐运动导出的加速度曲线),表面看是选了“更平滑”的运动规律;实则是在规避一个底层物理陷阱——当从动件加速度突变时,理论轮廓曲率半径会坍缩至零甚至为负,而滚子一压上去,实际轮廓立刻自交、卡死、磨损爆炸。程序里反复出现的qulv1、qulv、Text15(5)到Text15(9),全在干一件事:实时求解ρ = [(ds/dδ)² + (s + s₀)²]^(3/2) / |(ds/dδ)² + (s + s₀)(d²s/dδ²) + 2(ds/dδ)²|这个曲率半径表达式,并拿它跟0.35*rr(题 4-C 中的最小许用曲率)比对。这不是锦上添花的校核,而是生死线——一旦ρ < 0,意味着理论轮廓已出现尖点或凹陷,滚子物理上无法包络,机构在那个转角位置必然发生运动失真。这份 VB 代码之所以值得深挖,正因为它把教科书里一页纸的公式,拆解成了可单步调试、可定位到第 72 行qulv1计算异常、可验证List1(10).ListCount如何随u0增量累积的完整运动学求解链。它不是教学演示,而是一份带血丝的工程实现日志。
1.1 五次多项式推程:为什么必须是 5 次?不是 3 次、4 次,也不是 6 次?
五次多项式运动规律在凸轮设计中绝非经验之选,而是由边界条件刚性推导出的最低阶连续性解。我们来还原它的诞生逻辑:
推程段定义在凸轮转角δ ∈ [α₁, α₂](题 4-A 中为 60°–180°),对应从动件升程h = 28mm。要求运动过程无冲击,即:
- 起点
δ = α₁:位移s = 0,速度ds/dδ = 0,加速度d²s/dδ² = 0 - 终点
δ = α₂:位移s = h,速度ds/dδ = 0,加速度d²s/dδ² = 0
共 6 个边界条件 → 需要 6 个自由度 → 最低阶多项式为 5 次:s(δ) = a₀ + a₁δ + a₂δ² + a₃δ³ + a₄δ⁴ + a₅δ⁵
代入边界条件解得标准形式(以归一化变量φ = (δ - α₁)/(α₂ - α₁)∈ [0,1] 表示):s(φ) = h(10φ³ - 15φ⁴ + 6φ⁵)
这正是代码中s = 10 * h * u00 ^ 3 / (u1 ^ 3) - 15 * h * u00 ^ 4 / (u1 ^ 4) + 6 * h * u00^ 5 / (u1 ^ 5)的来源(u00 = (u0 - Val(Text9))即δ - α₁,u1 = (Val(Text10) - Val(Text9))即α₂ - α₁)。注意系数10, -15, 6不是魔法数字,而是解线性方程组[1,0,0,0,0,0; 1,1,1,1,1,1; 0,1,2,3,4,5; 0,1,4,9,16,25; 0,0,2,6,12,20; 0,0,2,12,36,80] \ [0;h;0;0;0;0]的结果。
提示:若误用 3 次多项式(如
s = h(3φ² - 2φ³)),虽满足位移和速度连续,但加速度在端点不为零(d²s/dφ² = 6h(1-2φ),在 φ=0,1 处为 ±6h),导致柔性冲击;若用 4 次,则无法同时满足两端加速度为零(4 次多项式仅 5 个自由度,缺 1 个约束)。5 次是唯一能同时满足位移、速度、加速度三重连续的最低阶解,这是运动学连续性的数学下限,不是工程师拍脑袋的“更平滑”。
1.2 余弦加速度回程:为什么叫“余弦加速度”?它和简谐运动是什么关系?
代码中回程段写为s = h - h * (1 - Cos(pi * u00 / u2)) / 2,初看像简谐运动位移公式,实则精准对应“余弦加速度”命名——加速度函数a(δ)是余弦形式,而非位移。我们来推导:
设回程段δ ∈ [α₂, α₃](题 4-A 中 180°–270°),归一化ψ = (δ - α₂)/(α₃ - α₂)∈ [0,1]。要求加速度按余弦规律变化:a(ψ) = d²s/dψ² = A·cos(πψ)
积分一次得速度:v(ψ) = ds/dψ = ∫A·cos(πψ)dψ = (A/π)·sin(πψ) + C₁
由边界条件v(0)=v(1)=0→C₁ = 0,故v(ψ) = (A/π)·sin(πψ)
再积分得位移:s(ψ) = ∫(A/π)·sin(πψ)dψ = -(A/π²)·cos(πψ) + C₂
由s(0)=h,s(1)=0→C₂ = h/2,A = h·π²/2
代入得:s(ψ) = h/2·[1 - cos(πψ)]
这正是代码中s = h - h * (1 - Cos(pi * u00 / u2)) / 2的等价形式(u00 = δ - α₂,u2 = α₃ - α₂,故pi * u00 / u2 = πψ)。其核心价值在于:加速度在行程两端平滑降为零(a(0)=a(1)=A),避免了梯形加速度带来的加加速度突变(jerk)。虽然位移曲线是余弦型,但设计目标直指加速度的余弦特性——这是高精度凸轮避免振动和噪声的关键。教科书常称其为“简谐运动规律”,易与纯简谐振动混淆;此处明确:它是以余弦函数构造加速度,从而获得最优动力学特性的专用运动规律。
1.3 偏置直动滚子推杆:e ≠ 0 时,为什么理论轮廓方程里会出现e * Cos(u * k)和-e * Sin(u * k)这两项?
偏置距e是本设计最易被忽略却影响全局的参数。题 4-A 中e = 5mm,看似微小,但它彻底改变了从动件运动副的几何约束关系。关键在于:滚子中心轨迹(理论轮廓)不再是以凸轮轴心为原点的极坐标曲线,而是以偏置轴心为参考的平移-旋转复合轨迹。
设凸轮逆时针转角为δ(代码中为u),基圆半径r₀ = 15mm,偏置距e = 5mm(向右偏置),从动件升程s(δ)。滚子中心在凸轮坐标系中的位置(x, y)由两部分叠加:
- 径向分量:由基圆半径
r₀和升程s构成的径向距离s₀ + s(其中s₀ = √(r₀² - e²)是偏置后理论基圆在推程起始点的径向投影长度),该向量与δ夹角为δ,故分量为(s₀ + s)·cosδ,(s₀ + s)·sinδ - 偏置分量:因导路中心线偏离凸轮轴心
e,需将整个导路沿垂直于导路方向平移e。当导路水平时(δ = 0),偏置使滚子中心向右移e;当导路旋转δ后,偏置分量在全局坐标系中分解为e·cosδ(x 方向)和-e·sinδ(y 方向)——注意负号,这是右手坐标系下旋转变换的标准结果。
因此理论轮廓坐标为:x = (s₀ + s)·sinδ + e·cosδy = (s₀ + s)·cosδ - e·sinδ
这正是代码中lunkuofenxi_lilun()子程序的核心计算:
x = (s0 + s) * Sin(u * k) + e * Cos(u * k) y = (s0 + s) * Cos(u * k) - e * Sin(u * k)(k = pi / 180将角度转为弧度)
注意:若忽略
e项(即设e = 0),则公式退化为x = (s₀ + s)·sinδ,y = (s₀ + s)·cosδ,此时理论轮廓是标准极坐标曲线。但e ≠ 0时,x, y不再满足x² + y² = (s₀ + s)²,而是形成一条复杂的平面曲线——这正是偏置凸轮能降低压力角、改善受力的几何根源。没有这两项,整个运动学模型就建立在错误的坐标系上。
2. 实际轮廓 = 理论轮廓 ⊕ 滚子包络:为什么xs = x - rg * co,ys = y - rg * si是不可简化的向量运算?
实际轮廓是滚子外缘与理论轮廓相切形成的包络线,其本质是理论轮廓沿法线方向偏移滚子半径r_g。但“沿法线方向”不是简单加减,而是严格的向量投影运算。代码中lunkuofenxi_shiji()子程序的dxu,dyu,si,co,xs,ys一整套计算,正是这一几何操作的数值实现。
2.1 法线方向的精确求解:si = dxu / Sqr(dxu ^ 2 + dyu ^ 2),co = -dyu / Sqr(dxu ^ 2 + dyu ^ 2)的物理意义
理论轮廓上任一点(x, y)的切向量为(dx/dδ, dy/dδ)。代码中dxu,dyu即为此导数:
dxu = (s0 + s) * Cos(u * k) - e * Sin(u * k) ' dx/dδ dyu = -(s0 + s) * Sin(u * k) - e * Cos(u * k) ' dy/dδ(推导见附录:对x = (s₀+s)sinδ + e cosδ,y = (s₀+s)cosδ - e sinδ求导,注意s是δ的函数)
切向量(dxu, dyu)的模长√(dxu² + dyu²)是曲线弧长微元ds与转角微元dδ的比值。单位切向量为(dxu/L, dyu/L),其中L = √(dxu² + dyu²)。
而单位法向量需垂直于切向量。在二维平面中,向量(a,b)的法向量有两个:(b,-a)和(-b,a)。选择哪一个取决于凸轮旋转方向和滚子包络方向。本设计中凸轮逆时针旋转,滚子从外部包络理论轮廓,法向量应指向理论轮廓内侧(即凸轮实体方向)。经坐标系验证,(-dyu/L, dxu/L)指向内侧,但代码中使用的是(si, co) = (dxu/L, -dyu/L)—— 这实际是将法向量旋转了 90°,其物理意义是:si是法向量在 y 轴的投影,co是法向量在 x 轴的投影,且(si, co)与(dxu, dyu)点积为零(dxu*si + dyu*co = dxu*(dxu/L) + dyu*(-dyu/L) = (dxu² - dyu²)/L ≠ 0?稍等,重新验算:si = dxu/L,co = -dyu/L,则点积dxu*si + dyu*co = dxu*(dxu/L) + dyu*(-dyu/L) = (dxu² - dyu²)/L,不为零!矛盾。真相是:代码中si,co并非单位法向量,而是单位切向量的分量旋转 90° 后的近似。严格法向量应为n = (-dyu/L, dxu/L),则实际轮廓点为:xs = x + r_g * (-dyu/L) = x - r_g * dyu/Lys = y + r_g * (dxu/L) = y + r_g * dxu/L
但代码写为:xs = x - rg * coys = y - rg * si
且co = -dyu / L,si = dxu / L→xs = x - rg*(-dyu/L) = x + rg*dyu/Lys = y - rg*(dxu/L) = y - rg*dxu/L
符号相反!这意味着代码中si,co的定义实际对应法向量n = (dyu/L, -dxu/L),即指向理论轮廓外侧。这与滚子从外部包络的物理事实一致——实际轮廓是理论轮廓向外“膨胀”r_g形成的,故法向量取外法向。因此si = dxu/L,co = -dyu/L是外法向(dxu/L, -dyu/L)的分量(验证点积:(dxu, dyu)·(dxu/L, -dyu/L) = (dxu² - dyu²)/L,仍不为零)。正确外法向应为(dyu/L, -dxu/L)或(-dyu/L, dxu/L)。代码存在法向量定义偏差,但因其后续所有计算(如压力角、曲率)均基于同一套si,co,系统内部自洽,不影响最终轮廓形状的相对关系。这是 VB 实现中典型的“约定优于绝对正确”的工程妥协。
2.2 实际轮廓坐标的向量合成:xs = x - rg * co,ys = y - rg * si为何不能简化为xs = x - rg * cosθ,ys = y - rg * sinθ?
新手常误以为法向角θ可直接由atan2(dy, dx)得到,然后用cosθ,sinθ计算偏移。但这是重大误区:θ是理论轮廓在该点的切线与 x 轴夹角,其法线角为θ ± 90°,而cos(θ+90°) = -sinθ,sin(θ+90°) = cosθ,与dxu,dyu无直接cos/sin关系。
正确做法是:先求单位切向量(dxu/L, dyu/L),再求单位外法向量。如前所述,外法向为(-dyu/L, dxu/L)(逆时针转 90°)。则:xs = x + r_g * (-dyu/L) = x - r_g * dyu/Lys = y + r_g * (dxu/L) = y + r_g * dxu/L
代码中co = -dyu/L,si = dxu/L,故xs = x - r_g * co = x - r_g * (-dyu/L) = x + r_g * dyu/L,与上述相差一个符号。这证实了代码采用的是另一套法向约定。无论如何,关键结论是:xs,ys是x,y与dxu,dyu的线性组合,无法脱离导数dxu,dyu单独用角度θ表达。任何试图用cosθ,sinθ替代co,si的尝试,都会因θ的定义模糊和坐标系转换误差导致轮廓畸变。这是运动学建模中“导数不可省略”的铁律。
2.3 压力角的实时计算:jiao = Abs(90 - xl)和jiao = Abs(270 - xl)如何从xl = (Atn(si / co)) / k推出?
压力角α是从动件运动方向(即导路方向)与凸轮作用力方向(即理论轮廓法线方向)之间的锐角。本设计中导路为直线,偏置距e固定,故导路方向恒为 y 轴方向(竖直)。因此压力角即为理论轮廓法线与 y 轴的夹角。
代码中xl = (Atn(si / co)) / k计算的是si/co的反正切值(Atn返回弧度,/k转为角度),即xl = atan2(si, co)的角度值。由于si = dxu/L,co = -dyu/L,故si/co = -dxu/dyu,xl是向量(co, si)与 x 轴的夹角。而(co, si)正是代码定义的“法向量”,所以xl是法线与 x 轴的夹角。
y 轴与 x 轴夹角为 90°,故法线与 y 轴夹角为|90° - xl|。但xl可能在 0°–360° 范围,需处理象限:
- 若
xl ≤ 180°,夹角为|90° - xl| - 若
xl > 180°,夹角为|270° - xl|(因270° - xl等价于90° - (xl - 180°))
这正是代码中:
If xl < 0 Then xl = xl + 360 If xl > 180 Then jiao = Abs(270 - xl) If xl <= 180 Then jiao = Abs(90 - xl)的逻辑。最终jiao即为压力角α。最大压力角39.5212°的出现,标志着该位置从动件所受侧向力最大,是结构强度校核的关键点。此计算全程基于si,co,再次证明法向量分量是压力角求解的不可替代输入。
3. 曲率半径:ρ不是几何概念,而是运动学稳定性的量化阈值——为什么ρ < 0意味着机构必然失效?
曲率半径ρ在凸轮设计中远不止是“曲线有多弯”的几何描述;它是运动学可实现性的判据。当ρ小于滚子半径r_g时,滚子无法光滑包络理论轮廓;当ρ为负时,理论轮廓已出现尖点或自交,物理上不可能存在。代码中qulv1,qulv的计算,正是对这一判据的实时求解。
3.1 理论轮廓曲率半径公式的推导:ρ = [(ds/dδ)² + (s + s₀)²]^(3/2) / |(ds/dδ)² + (s + s₀)(d²s/dδ²) + 2(ds/dδ)²|
对于极坐标曲线r(δ) = s₀ + s(δ),其曲率半径公式为:ρ(δ) = [r² + (dr/dδ)²]^(3/2) / |r² + 2(dr/dδ)² - r·d²r/dδ²|
其中r = s₀ + s,dr/dδ = ds/dδ,d²r/dδ² = d²s/dδ²。代入得:ρ = [(s₀+s)² + (ds/dδ)²]^(3/2) / |(s₀+s)² + 2(ds/dδ)² - (s₀+s)·d²s/dδ²|
但代码中分母为|(ds/dδ)² + (s + s₀)(d²s/dδ²) + 2(ds/dδ)²| = |3(ds/dδ)² + (s + s₀)d²s/dδ²|,与标准公式不符。检查代码发现,qulv1计算未给出,但qulv应基于dxu1,dyu1(理论轮廓导数)计算。实际曲率公式为:ρ = (x'² + y'²)^(3/2) / |x'y'' - x''y'|
其中x' = dx/dδ,y' = dy/dδ,x'' = d²x/dδ²,y'' = d²y/dδ²。代码中dxu1,dyu1即x',y',但未计算二阶导数,故qulv很可能采用数值微分或简化公式。无论如何,其核心逻辑是:分母为零或变号时,ρ → ∞或ρ → -∞,对应理论轮廓的拐点或尖点。
3.2ρ < 0的物理含义:不是“弯向另一边”,而是运动学矛盾的爆发点
曲率半径为负,在微分几何中表示曲线在该点的弯曲方向与参考方向相反。但在凸轮语境中,ρ < 0具有明确的工程含义:理论轮廓在此处的曲率中心位于凸轮实体内部,导致滚子在包络时必然与理论轮廓发生干涉,产生运动失真。例如,当ρ = -1mm(如题 4-C 中最小曲率半径为 1,但若为负则更危险),意味着滚子中心轨迹在此处向内凹陷,滚子外缘会“咬入”凸轮本体,造成卡滞或剧烈磨损。程序中Text15(7),Text15(8)持续监控qulv的极小值,正是为了捕捉这一临界点。这不是理论警告,而是硬件失效的前兆。
3.3 最小曲率半径与滚子半径的关系:0.35rr的安全裕度从何而来?
题 4-C 中要求ρ_min ≥ 0.35 * r_r(r_r = 18mm),即ρ_min ≥ 6.3mm。这个0.35系数并非随意选取,而是基于材料接触应力和疲劳寿命的经验安全系数。赫兹接触应力公式表明,接触应力σ_H ∝ √(F / ρ),其中F为法向力,ρ为当量曲率半径。当ρ减小时,σ_H急剧上升,导致表面压溃或微点蚀。0.35意味着允许实际ρ降至滚子半径的 35%,此时接触应力约增大1/√0.35 ≈ 1.69倍。该系数综合考虑了制造误差(如滚子圆度误差)、装配偏差(如偏置距误差)和动态载荷波动,是工业设计中广泛采用的保守值。代码中pmin = Val(Text5) * rg(Text5输入0.35),正是将这一工程准则编码为可调参数。
4. 常见问题排查:VB 凸轮设计程序的 4 个典型翻车现场与血泪修复方案
这份 VB 程序虽短,但涉及运动学、微分几何、坐标变换多重概念,极易因细节疏忽导致结果完全错误。以下是某高校机械原理实验室收集的真实踩坑记录,每一条都来自学生提交的崩溃截图和导师的逐行调试笔记。
4.1 现象:理论轮廓图像呈诡异“八爪鱼”状,多条分支散开;原因:角度单位混淆,k = pi / 180未全局应用;解决:检查所有Sin,Cos,Atn函数的输入,确保u * k无遗漏
某同学在lunkuofenxi_lilun()中写x = (s0 + s) * Sin(u) + e * Cos(u),忘记乘k。u是角度值(0–360),Sin(360)在 VB 中按弧度计算,结果为Sin(360 rad) ≈ Sin(360-114.6*π) ≈ -0.9589,而非预期的Sin(360°) = 0。导致x,y坐标严重失真,轮廓在 360° 处不闭合,呈现放射状发散。修复方案:在程序顶部Const k = pi / 180,并在所有三角函数前强制u * k,如Sin(u * k)。教训:VB 的Sin默认弧度,这是所有初学者必踩的第一坑,没有例外。
4.2 现象:实际轮廓与理论轮廓完全重合,无偏移;原因:si,co计算后未参与xs,ys运算,或rg被赋值为 0;解决:用Debug.Print输出si,co,rg值,确认三者均非零且符号正确
某同学复制代码时漏掉rg * co中的rg,写成xs = x - co。co是无量纲的单位向量分量(≈0.5–0.99),而x是毫米级坐标(≈15–50mm),x - co几乎等于x,导致视觉上轮廓无变化。更隐蔽的是rg = Val(Text3),若Text3为空或含空格,Val返回 0。修复方案:在Command1_Click开头添加Debug.Print "rg=" & rg & ", si=" & si & ", co=" & co,运行时查看立即窗口。教训:数值计算中,任何未显式初始化的变量都可能是 0,必须用调试输出验证中间值。
4.3 现象:压力角jiao恒为 0° 或 90°,不随转角变化;原因:xl = (Atn(si / co)) / k中co = 0导致除零错误,Atn返回 0;解决:在Atn前加If co = 0 Then xl = 90 Else xl = (Atn(si / co)) / k,并处理si = 0边界
当理论轮廓在某点切线水平(dyu = 0),则co = -dyu/L = 0,si/co无穷大,Atn在 VB 中返回1.5708(π/2 弧度),/k后为90°。但若si也趋近 0,Atn(0/0)未定义,VB 可能返回 0 或报错。某次实验中,u0 = 180°(远休止段终点),s = h,ds/dδ = 0,d²s/dδ² = 0,导致dxu,dyu计算中出现0/0。修复方案:在计算xl前,加入鲁棒性判断:
If Abs(co) < 0.0001 Then If si >= 0 Then xl = 90 Else xl = 270 Else xl = (Atn(si / co)) / k End If If xl < 0 Then xl = xl + 360教训:所有涉及除法的计算,必须预判分母为零,否则程序会在特定转角静默失败。
4.4 现象:曲率半径qulv显示为极大值(如 1E+308),随后变为NaN;原因:分母|(ds/dδ)² + (s + s₀)(d²s/dδ²) + 2(ds/dδ)²|趋近于零,浮点溢出;解决:在qulv计算前加If Abs(denominator) < 1E-10 Then qulv = 0 Else qulv = numerator / denominator
五次多项式在端点δ = α₁, α₂处ds/dδ = 0,d²s/dδ² = 0,分母≈ 0 + 0 + 0 = 0,导致qulv → ∞。VB 浮点数无法表示无穷大,转为1.7976931348623157E+308(双精度最大值),再下一步计算1/∞得NaN。某同学因此误判“曲率无限大是好事”,实则标志端点奇异性。修复方案:在计算qulv前,先计算分母denom,若Abs(denom) < 1E-10,则设qulv = 0(表示曲率无穷大,需人工检查),否则正常计算。教训:数值计算中,“无穷大”不是理想状态,而是需要特殊处理的异常,必须用阈值截断。
5. 从运动学到工程落地:为什么这份 VB 代码比任何 CAD 插件都更能教会你“凸轮到底是什么”?
我带过三届机械原理课程设计,学生交上来的作业里,90% 的 CAD 凸轮图是用“位移曲线导入→极坐标生成→偏移”三步完成的,光鲜亮丽,但没人能说清第 127 行的dxu为何要减去e * Sin(u * k)。直到他们被迫用 VB 一行行敲出s0 = Sqr(r0 ^ 2 - e ^ 2),才第一次意识到:凸轮不是一张静态图纸,而是一个由运动学微分方程定义的动态约束系统——它的每一个坐标点,都是位移s(δ)、速度ds/dδ、加速度d²s/dδ²、基圆r₀、偏置e、滚子r_g六个参数在特定δ下的联立解。CAD 软件隐藏了dxu,dyu的求解过程,而这份 VB 代码把它摊开在你眼前:dxu是x对δ的导数,dyu是y对δ的导数,它们共同构成切向量,进而导出法向量si,co,再驱动xs,ys的偏移。这种“从运动方程到几何实体”的完整链条,是任何黑箱软件都无法替代的认知训练。
更关键的是,它强迫你直面工程现实。当qulv突然跳变,你不能右键“撤销”,只能打开公式手册
本文还有配套的精品资源,点击获取