MSP430G2553 PWM控制速度,并自我检测和简单调节速度_ta1ccr0和ta1r-程序员宅基地

技术标签: msp  MSP430  嵌入式  单片机  

MSP430G2553 测量小车速度,并简单调速

需要了解MSP430系列的GPIO,TIMERA,UART相关的知识
涉及内容:PWM输出配置,TIMER A 的捕捉/比较寄存器的输入捕捉配置,串口通信的配置,系统时钟的配置

STEP 1 测量小车速度的方法

公式:v = s/t;
s,就是轮子周长;t就是中断周期

PREPARE 1 小车橡胶轮子

在这里插入图片描述

  • 参数:在这里插入图片描述

  • 周长:C=2*pi*R=pi*D=20.41975cm;总共20个洞。

  • 1.0209875cm/洞

  • 每穿过一个洞,产生一个中断,得到计算的周期T

  • v = s/t

PREPARE 2 测速模块

未被遮挡,指示灯亮,输出高电平
被遮挡,指示灯灭,输出低电平

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

STEP 2 MSP430 输入捕捉中断计算速度

开发板:MSP430G2ET(MSP430G2553)

设计思路

  1. 使用定时器A的计数器1的CCR2作为输入捕捉的功能。
  2. TACCR0寄存器的值,就是UP MODE 的峰值
  3. 总时间 = (时间戳时间间隔)* TACCR0周期 + 中断捕捉时间间隔
  4. 速度 = S / 总时间

代码部分

1. 输入捕捉配置
  • TA1CTL,
  • TA1CCTL
  • P2SEL,
  • 总中断使能打开
void TA1_CCR2_PIN1_5()
{
   
    
    /*设置定时间隔*/
//    TA1CCR0 = 49999;//50ms
    /*开启TAIFG中断*/
    TA1CTL |= TAIE;
    /*TA1,CCR2用于捕捉功能*/
    TA1CCTL2 |= CAP;
    /*上升沿捕捉*/
    TA1CCTL2 |= CM0;
    /*P2.5作为捕捉输入(CCI2B)*/
    TA1CCTL2 |= CCIS0;
    P2SEL |= BIT5;
    /*允许捕捉比较中断*/
    TA1CCTL2 |= CCIE;
    __bis_SR_register(GIE);
}
2. PWM波输出配置
  • P2SEL(Px端口第二功能),
  • P2DIR(端口输出方向),
  • TA1CTL(定时器A控制寄存器),
  • TA1CCTL1(CCR1控制寄存器),
  • TA1CCR0(UP MODE的周期),
  • TA1CCR1(PWM输出)
void TA11_P21_PWM_OUT(void)
{
   
    
    P2SEL |= BIT1;
    P2DIR |= BIT1;//P2.1设为输出TA1.1
    TA1CTL |= TASSEL_2 + MC_1;  //选SMCLK,UP MODE
    TA1CCTL1 = OUTMOD_7;
    TA1CCR0 = 2000;
    TA1CCR1 = PWM; //占空比:TACCR1/TACCR0
}
3. 中断服务函数

捕捉/比较1,捕捉/比较2,定时器中断溢出共用一个中断向量
在这里插入图片描述

#pragma vector = TIMER1_A1_VECTOR
__interrupt void Time_Tick(void)
{
   
    
    static uint8_t cnt = 0;
    __bis_SR_register(GIE);//允许中断嵌套
    switch(TA1IV)
    {
   
    
    case 0x02://捕捉比较中断1
        break;
    case 0x04://捕捉比较中断2
        if(cnt == 0)
        {
   
    
            capvalue_1 = TA1CCR2;//保存第一次捕捉值
            timestamp_1 = timestamp;//保存第一次时间戳
            cnt ++;
        }
        else
        {
   
    
            capvalue_2 = TA1CCR2;//保存第二次捕捉值
            timestamp_2 = timestamp;//保存第二次时间戳
            cnt = 0;
            totaltime = (timestamp_2 - timestamp_1) * 2000 + capvalue_2 - capvalue_1;//计算总时间
        }
        break;
    case 0x0A://溢出中断
        timestamp ++;
        break;
    default:
        break;
    }
}

总代码及演示效果

#include <msp430.h>
#include "stdint.h"
#include <stdio.h>
//#define PWM    170 // max for RCCX UNDER 2000
uint32_t timestamp = 0;//时间戳
uint16_t capvalue_1 = 0;//第一次捕捉值
uint16_t capvalue_2 = 0;//第二次捕捉值
uint32_t timestamp_1 = 0;//第一次时间戳
uint32_t timestamp_2 = 0;//第二次时间戳
uint32_t totaltime = 0;
float freq = 0;
#define P1_IE_ON        P1IE |= BIT3
#define P1_IE_OFF        P1IE &=~ BIT3

int num = 0;

int temp = 0;
unsigned int i,j;
/*
 *  @FN:    void GPIO_INIT()
 *  @PAR:   NONE
 *  @RETURN:NONE
 *  @BRIEF:配置三个 TCRT5000 模块
 */
//void GPIO_INIT()
//{
   
    
//    P1DIR &=~(BIT3+BIT4+BIT5);
//    P1REN |= (BIT3+BIT4+BIT5);
//    P1OUT &=~(BIT3+BIT4+BIT5);
//}

/*
 *  @FN:    void InitSystemClock(void)
 *  @PAR:   NONE
 *  @RETURN:NONE
 *  @BRIEF: 配置系统时钟1MHZ
 */

void 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AISc_O/article/details/109064704

智能推荐

ffmpeg mp4 提取h265命令行_安装FFmpeg多媒体库,以及命令行程序使用介绍-程序员宅基地

文章浏览阅读1k次。FFmpeg是非常流行的多媒体框架,主要用于音视频的解码、编码、转码、混流、过滤、播放等操作。2000年,法国著名的程序员Fabrice Bellard创建FFmpeg项目,前两个字母FF是Fast Forward的意思,同时他也发起MPlayer开源多媒体播放器项目。FFmpeg图标围绕FFmpeg后续将讲解FFmpeg的命令行操作,使用FFmpeg的API编写程序,深入源码进行分析等,本篇介绍..._h265 提取strm

Web网页设计之css_4. css 其他选择器_网页设计选择器类型介绍-程序员宅基地

文章浏览阅读1.1k次。我们在说 css 的核心基础的时候,介绍了三种选择器类型,分别是:class 选择器,id 选择器,标签选择器,但是啊,我们日常用到的肯定不止这些,我们这篇主要来说说一些除此之外的其他选择器,这个我们日后工作会常常用到~一、分组选择器先来说说分组选择器的由来,再说这个东西具体怎么用1. 由来我们知道啊,css 层叠样式由很多,但是在一个网页中,肯定有相同、或者说就是一模一样的样式,但是我们总不能一个一个去复制粘贴一遍,所以,为了我们更好的去定义css,我们需要一个选择器可以支持到我们做到这个_网页设计选择器类型介绍

php中统一编码语句,在PHP中比较字符串之前,使编码统一-程序员宅基地

文章浏览阅读84次。我正在开发一项功能,要求我获取网页的内容,然后检查该页面中是否存在某些文本.这是一个反向链接检查工具.问题是-函数在大多数情况下都能完美运行,但是有时,当链接明显位于该页面时,它会将页面标记为没有链接.我已经将其跟踪到视觉上比较输出中的字符串的程度,并且它们匹配得很好,但是使用==运算符,php告诉我它们不匹配.意识到这可能是某种编码问题,所以我决定看看如果在它们上使用base64_encode(...

Linux学习之路(二)查看系统剩余空间_kali查看剩余空间-程序员宅基地

文章浏览阅读523次。Linux下查看系统剩余空间1.查看系统整体空间剩余情况在命令行中输入“df -h”可以查看系统的分配,已使用和可用情况。如下图:2.查看每个文件夹的占用情况在命令行中输入 “du -sh *”可以查看每个文件夹的大小。此举可以快速定位大文件所存在的位置。..._kali查看剩余空间

金融评测指标empyrical库详解Sortino、calmar、omega、sharpe、annual_return、max_drawdown-程序员宅基地

文章浏览阅读1.9w次,点赞14次,收藏99次。empyreal生平empyrical是常用金融风险和表现度量。被zipline和pyfolio采用。三者都是quantopian开发维护。Github 官方文档API参考sortino_ratioempyrical.sortino_ratio(returns, required_return=0, period='daily', annualization=None, ..._empyrical库

.NET高级工程师面试经历_高级.net高级高频面试-程序员宅基地

文章浏览阅读1w次,点赞3次,收藏20次。1.SQL Server数据库操作的原子性,出Select之外,Update、Insert、Delete的操作都是原子性的,不可拆分,执行的最小单位;可以用于充值交费中 ,如果多个请求进行更新同一条 数据时,直接使用update Table1 set money=money+100 这种方式就可以避免多个语句,更新一条记录导致的更新失败的问题(一般想法是,先查询当前的账户余额,然后进行更新,这..._高级.net高级高频面试

随便推点

matlab filter rayleighchan,关于Matlab中rayleighchan这个函数的使用-程序员宅基地

文章浏览阅读890次。关于Matlab中rayleighchan这个函数的使用12-16各位大哥:关于Matlab中,现在有个rayleighchan这样的函数,它能产生瑞利衰落的信道,但是,其中的有个参数不是很理解,Help里面也没有讲清楚。它其中有个参数叫做:AvgPathGaindB-----average path gains;另外还有一个只读的参数是:PathGains。现在搞不清楚这两个参数之间是什么关系,..._matlab2020 无法调用rayleighchan

ABAP 创建设备BAPI BAPI_EQUI_CREATE-程序员宅基地

文章浏览阅读996次。DATA: EXT_NUMBER TYPE BAPI_ITOB_PARMS-EQUIPMENT. DATA: DATA_GENERAL TYPE BAPI_ITOB. DATA: DATA_GENERAL_EXP TYPE BAPI_ITOB. DATA: DATA_SPECIFIC TYPE BAPI_ITOB_EQ_ONLY. DATA: DATA_INSTALL TYPE BAPI_ITOB_EQ_INSTALL. DATA: RETURN TYPE B._bapi_equi_create

1042 字符统计-程序员宅基地

文章浏览阅读67次。请编写程序,找出一段给定文字中出现最频繁的那个英文字母。输入格式:输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。输出格式:在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。输入样例:This is a simple TEST. There ARE numbers and oth

零知识证明应用到区块链中的技术挑战-程序员宅基地

文章浏览阅读1.3k次。零知识证明应用到区块链中的技术挑战李康1,2, 孙毅1,2, 张珺3, 李军4, 周继华5, 李忠诚11. 中国科学院计算技术研究所,北京 100190 2. 中国科学院..._零知识证明技术的国内外研究现状

java 小数乘法_集合复习教案-程序员宅基地

文章浏览阅读159次。集合jí hé[释义]①(动)许多分散的人或物聚在一起。民兵已经在村前~了。(作谓语)②(动)使集合。~各种材料;加以分析。(作谓语)[构成]动补式:集〈合[反义]分散、解散[同音]极核...仿写复习教案一、《语文课程标准》:根据语言情境的需要进行仿写、扩写、续写等,做到语言准确、连贯、流畅。其实仿写语句试题有一定的综合性,它往往涉及语法结构、表达方式、语意连贯、修辞运用、风格谐调等许多方面,也间..._java 小数乘法

v-if多个条件判断语句_v-else-if最多写几个-程序员宅基地

文章浏览阅读4.4w次。v-if多个条件判断语句还有条件则继续增加v-else-if// 我这里是三个条件,如果还有条件则继续增加 v-else-if <div v-if="item.enable === '已签到'"> <span class="badge badge-success">{{ item.enable }}</span> </div> <..._v-else-if最多写几个