我是靠谱客的博主 冷酷羊,最近开发中收集的这篇文章主要介绍[ARM]ADC电压采集与蜂鸣器实现——第七篇前言1、ADC电压采集实验2、ADC资料查询3、蜂鸣器实验,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

CSDN话题挑战赛第2期

 6d63dc5dd3994f75ae53a20768cc10f6.gif

???? 个人主页:???? 长夜慢慢想学习 ????

???? 本文收录专栏:????  ARM学习之路  ????

???? 其他专栏:???? C语言学习之路 ????

???? 学习格言:路漫漫其修远兮,吾将上下而求索

???? 欢迎点赞、关注、收藏( •̀ ω •́ )✧   一起努力,一起学习!

目录

前言

1、ADC电压采集实验

1.1、ADC控制器

1.2、ADC类型

1.3、如何获取电压值?

2、ADC资料查询

2.1、ADC转换寄存器

2.2、ADCCON控制寄存器

2.3、ADCMUX通道选择寄存器

2.4、ADC数据寄存器

2.5、ADC实现程序代码

2.6、ADC实验结果

3、蜂鸣器实验

3.1、蜂鸣器种类

3.2、蜂鸣器连接原理图

3.2、PWM时钟配置

3.3、TCFG0

3.4、TCFG1

3.5、TCON

3.6、GPD0CON

3.7、PWM实现程序代码

3.8、蜂鸣器实验结果


前言

        本篇是学习ADC模数转换与PWM控制输出得的实现,本篇共讲述了ADC和PWM两个实验,本篇难度不高,主要是熟悉电路结构和资料的查询,整理此篇学习内容与大家共赏!希望与大家共同进步,一起加油! 

        除了本篇内容,还有其他ARM学习内容收纳于 ????ARM学习之路????里,欢迎大家查看!

1、ADC电压采集实验

1.1、ADC控制器

        模数转换器:把模拟信号转为数字信号,把连续变化的模拟量转换为离散数字量(用数字量来表示模拟量)。

1.2、ADC类型

  • 逐次逼近型:速度一般,精度一般,体积小,成本低

  • 积分微分型:速度慢,精度高,体积大,成本低

  • 直接比较型:速度快,精度低,体积中,成本高

1.3、如何获取电压值?

芯片会通过电路中滑动变阻器来获取对应的电压值,将获取的电压值进行模数转换,转换成0、1这样的数字信号值。

(1)电路原理图

(2)与芯片连接的引脚图

2、ADC资料查询

2.1、ADC转换寄存器

  • ADCCON(控制寄存器):使能adc进行功能

  • ADCDAT(数据寄存器):转换之后的数字量存储到寄存器中

  • ADCMUX:要转换的输入通道选择

2.2、ADCCON控制寄存器

  • 转换精度选择:0-----10bit,1 -----12bit

  • 只读:1-----标志转换完成,0-----标志正在转换

  • 使能预分频:0-----关闭预分频,1-----开启预分频

  • 工作模式选择: 0-----普通模式

2.3、ADCMUX通道选择寄存器

输入通道选择:

  • 0x0----通道0

  • 0x1----通道1

  • 0x2----通道2

  • 0x3----通道3

2.4、ADC数据寄存器

  • 数据寄存器,存储转换完成之后的电压值,0bit—11bit就是对应的电压值。

  • 使用ADC控制器,采集电压,得到数字量电压值

2.5、ADC实现程序代码

#include "exynos_4412.h"
#include "uart.h"
​
void adc_init()
{
    //adc初始化
    //精度设置 12bit
    ADCCON |= 1<<16;
    
    //使能分频
    ADCCON |= 1<<14;
    
    //设置预分频
    ADCCON  = ADCCON & ~(0xff<<6) | 255;
    
    //普通模式
    ADCCON &= ~(1<<2);
    
    //不进行连续转换
    ADCCON &= ~(1<<1);
​
    //通道选择
    ADCMUX = 0x3;
}
​
int get_adc()
{
​
    //启动转换,设置为[0]:1开启转换
    ADCCON |= 1;
​
    while( (ADCCON & 1<<15) == 0 );
    
    //ADCDAT & 0xfff ----实际电压值(数字量)
    return 1.8 * 1000 / 4096 * (ADCDAT & 0xfff);
​
}
​
int main()
{
    //串口初始化
    uart_init();
    
    printf("program is startn");
    adc_init();
    int V;
    while(1)
    {
        V = get_adc();
        printf("V is %dn",V);//打印对应电压值
    }
    return 0;
}
​

2.6、ADC实验结果

  •  循环显示电压值

3、蜂鸣器实验

3.1、蜂鸣器种类

  • 无源蜂鸣器:内部无发声源,需要外部加载发声源

  • 有源蜂鸣器:内部有发生源,不需要外部加载发声源

3.2、蜂鸣器连接原理图

  • PWM可以设置输出可调节的高电平时间、低电平时间的波形

  • 芯片输出高低电平进行切换可以让蜂鸣器发声

3.2、PWM时钟配置

  • PWM控制器实现输出脉宽波形,对应引脚就有脉宽波形

3.3、TCFG0

3.4、TCFG1

  • 设置timer0、pwm0固定分频

3.5、TCON

  • 设置自动重载寄存器进行重载

3.6、GPD0CON

  • GPD0CON[0] [3:0]-------0x2(GPIO设置为PWM输出)

3.7、PWM实现程序代码

#include "exynos_4412.h"
#include "uart.h"
​
​
void pwm_init()
{
​
    //GPIO
    GPD0.CON = GPD0.CON & ~(0xf) | 0x2;
    
    //pwm初始化
    
    //设置自动重载值
    PWM.TCNTB0 = 1000;
    
    //设置比较寄存器值
    PWM.TCMPB0 = 500;
​
    //设置预分频 500 Khz
    PWM.TCFG0 = PWM.TCFG0 & ~(0xff) | 199;
    
    //设置固定分频
    PWM.TCFG1 &= ~(0xf);
    
    //进入定时的频率为 500k hz
    //每一个周期时间为1/500k
    //最大能够计数 1000
    //一个pwm波形(高低)时间1/500,输出的pwm波形频率为500hz
​
    PWM.TCON |= 1<<3;
    
    //设置使能输出 TOUT0输出
    PWM.TCON |= 1<<2;
    
    //设置更新自动装载,和比较寄存器
    PWM.TCON |= 1<<1;
    
    //关闭更新自动装载和比较寄存器
    PWM.TCON &= ~(1<<1);
    
    //开启pwm
    PWM.TCON |= 1;
}
​
void delay()//延时函数
{
    int i,j;
    for(i = 0;i < 1000;i++)
    {
        for(j=0;j< 1000;j++);
    }
}
​
int main()
{
​
    uart_init();
    printf("program is startn");
    pwm_init();
    delay();
    PWM.TCON &= ~1;
    while(1);
​
    return 0;
}

3.8、蜂鸣器实验结果


 

  •          此时蜂鸣器工作起来了,工作一定延时就自动停止工作。

---------------------------本篇到此结束啦,欢迎点赞关注-------------------------

最后

以上就是冷酷羊为你收集整理的[ARM]ADC电压采集与蜂鸣器实现——第七篇前言1、ADC电压采集实验2、ADC资料查询3、蜂鸣器实验的全部内容,希望文章能够帮你解决[ARM]ADC电压采集与蜂鸣器实现——第七篇前言1、ADC电压采集实验2、ADC资料查询3、蜂鸣器实验所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部