Atlanta won its second in a row to take the three-game series and increase its NL East lead to 6½ games.
San Francisco, the defending World Series champion, has lost 14 of its past 20 on the road, but the Giants remained just a game behind Arizona in the NL West.
Braves closer Craig Kimbrel pitched a scoreless ninth to earn his 19th save in 22 chances. Kimbrel struck out Andres Torres and Joaquin Arias before retiring Nick Noonan on a flyout.
Freeman, who began the night hitless in 11 career appearances against Giants starter Tim Lincecum, singled in his first three at-bats and improved his average to .456 with runners in scoring position – third-best in the majors.
One night after he drove in the winning run off Giants closer Sergio Romo, Freeman made it 1-0 in the first when his RBI single scored Andrelton Simmons from second.
Freeman’s single in the third moved Justin Upton to second. The next batter, B.J. Upton, drove in his brother Justin from second to put Atlanta up 2-0.
Teheran (5-3) allowed seven hits and one walk. The 22-year-old struck out eight and benefited from stellar plays by outfielders Jason Heyward and Justin Upton in the fourth, and by Simmons at shortstop in the sixth that kept a run from scoring with the Braves holding a two-run lead.
Lincecum (4-7) gave up six hits and five walks in six innings. Two of his three runs were earned, and he struck out three.
Torres, San Francisco’s left fielder, hurt his team in the bottom of the sixth when Ramiro Pena’s single appeared to bounce off his right foot and toward the wall.
Pena, who reached third on Torres’ two-base fielding error, scored when pinch-hitter Jordan Schafer drove him in with a sacrifice squeeze bunt to make it 3-0.
Teheran struggled in his previous outing, a 7-6 loss at San Diego last Monday, but he beat the Giants for the second time in two starts against them since May 9.
Lincecum, a two-time NL Cy Young Award winner, dropped to 0-6 in his last nine starts and has a 6.69 ERA over that span.
Luis Avilan and Jordan Walden pitched scoreless innings for Atlanta in the seventh and eighth.
Jose Mijares and rookie Jake Dunning, who made his major league debut, held the Braves to one hit in the seventh and eighth.