There are a bunch of different ways to look at 'evolution over time.' Based on your description of what you've already done, I'm assuming you want to estimate a chronogram (i.e., an ultrametric tree with branch lengths proportional to time). This involves estimating a tree while assuming a flavor of molecular clock, which 'translates' branch lengths from units of substitutions per site into substitutions per site per unit time.
There are two general ways to go about this:
You could estimate a tree using any of the standard likelihood-based programs (GARLI, RAxML, PAUP*, etc.) and then rescale the branches relative to time by assuming a clock. The simplest is to assume a strict clock, or a single rate of evolution across the entire tree. More complicated approaches allow rates to vary across the tree (so-called 'local clocks'). There are several approaches that do this (PAUP* can assume a strict clock; r8s can rescale a tree with heterogeneous, but autocorrelated, rates), but I would recommend Stephen Smith's treePL. This approach is quite accurate, especially for large phylogenies.
Alternatively, you can co-estimate trees and branch-specific substitution rates using Bayesian phylogenetic approaches. The most popular way to do this is using BEAST. BEAST allows users to place priors on a lot of different parameters, including the mean rate of evolution across the tree (assuming a strict clock) or on the mean and standard deviation hyperparameters describing an uncorrelated lognormal distribution of rates (among others). BEAST will produce posterior distributions of phylograms and chronograms, and you can summarize the posterior distributions using a variety of approaches. When using BEAST, this is commonly done using TreeAnnotator to get a point-estimate for analysis. You can also assume that you don't know anything about the time scale of the rates; BEAST will estimate relative rates per branch, and you could rescale the tree relative to time after the fact.