You can use Plot
with option combination PlotPoints
and MaxRecursion
(as mentioned by @coolwater in the comments), or DiscretePlot
:
ClearAll[v]
ff = 10000000; v0 = 8.7; T = 1*(1/ff);
v[t_] := v0*Sin[2*\[Pi]*ff*t];
plt1 = Plot[v[t], {t, 0, T}, PlotStyle -> Blue];
plt2 = Plot[v[t], {t, 0, T}, PlotPoints -> 10, MaxRecursion -> 0,
PlotStyle -> Opacity[1, Red]];
plt3 = DiscretePlot[{v[t], v[t]}, {t, 0, T, T/9},
PlotStyle -> Directive[Opacity[.5, Orange], Thickness[.01]],
Joined -> True, ImageSize -> 400, Filling -> None];
Legended[Show[plt1, plt3, plt2, ImageSize -> 500],
LineLegend[{Blue, Red, Orange}, Style[#, 20, "Palette"]&/@ {"Plot[v[t], {t, 0, T}]",
"Plot[v[t], {t, 0, T}, \nPlotPoints -> 10, MaxRecursion -> 0]",
"DiscretePlot[{v[t], v[t]}, {t, 0, T, T/9}]"}]]

ListPlot[Table[{t, %}, {t, 0, T, T/(steps+1)}]]
. Plot has options:PlotPoints
andMaxRecursions
to control the mesh $\endgroup$PlotPoints
option) and then keeps on refining it until the kinkiest parts of what it's plotting have been sufficiently sampled (controlled byMaxRecursion
and the now-hidden optionMaxBend
). $\endgroup$