LP-MSPM0L1306开发板试用体验---板载光敏电阻+PTC热敏电阻实验

[复制链接]
1443|5
 楼主| xiaoqi976633690 发表于 2023-10-8 19:18 | 显示全部楼层 |阅读模式
本帖最后由 xiaoqi976633690 于 2023-10-8 19:30 编辑

    《LP-MSPM0L1306开发板试用体验---板载光敏电阻+PTC热敏电阻实验
1、开发环境
开发板:LP-MSPM0L1306 LaunchPad™ 开发套件
IDE:Code Composer Studio 12.4.0
仿真器:板载
例程参考自官方
SDK\mspm0_sdk_1_10_01_05\examples\nortos\LP_MSPM0L1306\driverlib\adc12_sequence_conversion_LP_MSPM0L1306_nortos_gcc


2、硬件配置


注意:跳冒需要做一些变动


0.png

1.png

3.jpg

a4.png


3、代码实现
PTC热敏电阻原理PTC (Positive Temperature Coefficient) 效应 , 即正温度系数效应,是指此材料的电阻会随温度的升高而增加。
4.png

我们通过ADC采集分压后的电压,电压变化有下面规律
6.png


5.png
热敏电阻对应表 TI.zip (3.19 MB, 下载次数: 3)
温度上升->阻值变大->分压电压升高
温度下降->阻值变下->分压电压下降
根据电阻的计算工具我们得到2个数组分别对应温度和不同温度对应的电压值(mv)
  1. const int TMP6131DECT_PTC_TEMP_TABLE[166] = {
  2.         -40,-39, -38, -37, -36, -35, -34,-33, -32, -31,
  3.         -30, -29, -28,-27, -26, -25, -24, -23, -22,-21,
  4.         -20, -19, -18, -17, -16,-15, -14, -13, -12, -11,
  5.         -10,-9, -8, -7, -6, -5, -4, -3, -2, -1,
  6.         0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
  7.         10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  8.         20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
  9.         30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
  10.         40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  11.         50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  12.         60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
  13.         70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  14.         80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
  15.         90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
  16.         100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
  17.         110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
  18.         120, 121, 122, 123, 124, 125,

  19. };


const int TMP6131DECT_PTC_VOTAGE_TABLE[166] = {
    1305, 1310, 1316, 1321, 1326, 1331, 1336, 1342, 1347, 1352,  /*-40~-31, */
    1357, 1363, 1368, 1373, 1378, 1384, 1389, 1394, 1399, 1405,  /*-30~-21,  */
    1410, 1415, 1420, 1426, 1431, 1436, 1442, 1447, 1452, 1458,  /*-20~ -11, */
    1463, 1468, 1473, 1479, 1484, 1489, 1495, 1500, 1505, 1510,  /*-10~-1,  */
    1516, 1521, 1526, 1532, 1537, 1542, 1547, 1553, 1558, 1563,  /*0~9,  */
    1568, 1574, 1579, 1584, 1589, 1595, 1600, 1605, 1610, 1615,  /*10~19,  */
    1621, 1626, 1631, 1636, 1641, 1647, 1652, 1657, 1662, 1667,  /*20~29,  */
    1672, 1678, 1683, 1688, 1693, 1698, 1703, 1708, 1713, 1718,  /*30~39,  */
    1723, 1728, 1733, 1739, 1744, 1749, 1754, 1759, 1764, 1769,  /*40~49, */
    1774, 1778, 1783, 1788, 1793, 1798, 1803, 1808, 1813, 1818,  /*50~59, */
    1823, 1828, 1832, 1837, 1842, 1847, 1852, 1857, 1861, 1866,  /*60~69,  */
    1871, 1876, 1881, 1885, 1890, 1895, 1899, 1904, 1909, 1913,  /*70~79, */
    1918, 1923, 1927, 1932, 1937, 1941, 1946, 1951, 1955, 1960,  /*80~89*/
    1964, 1969, 1973, 1978, 1982, 1987, 1991, 1996, 2000, 2005,  /*90~99*/
    2009, 2014, 2018, 2022, 2027, 2031, 2035, 2040, 2044, 2048,  /*100~109*/
    2053, 2057, 2061, 2066, 2070, 2074, 2078, 2083, 2087, 2091,  /*110~119*/
    2095, 2099, 2104, 2108, 2112, 2116, /*120~125*/
};
  1. //温度对应电压(mv)



通过简单的函数就能实现将adc的电压值转换为温度
  1. int get_temprature(int Votage)
  2. {
  3.         int i = 0;
  4.         for (i = 0; i < 166; i++)
  5.         {
  6.                 if (Votage<=TMP6131DECT_PTC_VOTAGE_TABLE[i])//当没有ADC值对应温度的时候,就取相近的,也就是大于的情况
  7.                 {
  8.                         return i;
  9.                 }
  10.         }
  11.         return 0;

  12. }


打印温度有2种方式
  1.    xprintf("get_temprature=%d℃\n",get_temprature(a)-40);//获取温度值方式1
  2.    xprintf("Tempreture=%d℃\n\n",TMP6131DECT_PTC_TEMP_TABLE[get_temprature(a)]);//获取温度值方式2




PTC光敏二极管原理
光敏二极管的特点是具有将光信号转换为电信号的功能,并且其光电流的大小与光照强度成正比,光照越强光电流越大
7.png


光敏二极管代码比较简单,只需要读取ADC的值就好了。


ADC实现
SYSCFG配置


8.png
9.png
a0.png
a1.png
a2.png


获取ADC的值
  1. uint16_t Get_ADC(DL_ADC12_MEM_IDX idx) //DL_ADC12_MEM_IDX_0
  2. {

  3.         //uint16_t adcResult;
  4.         uint32_t adc_add=0;
  5.         uint8_t time=10;//采集次数
  6.         DL_ADC12_startConversion(ADC12_0_INST);
  7.         while (false == gCheckADC)
  8.         {
  9.                 __WFE();
  10.         }
  11.         for (uint8_t i=0;i<time;i++)
  12.         {
  13.                 delay_cycles((10));
  14.                 adc_add+=DL_ADC12_getMemResult(ADC12_0_INST, idx);
  15.                 gCheckADC = false;
  16.                 DL_ADC12_enableConversions(ADC12_0_INST);

  17.         }
  18.         return adc_add/10;//返回10次平均值
  19. }


ADC中断函数
  1. void ADC12_0_INST_IRQHandler(void)
  2. {
  3.         switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST))
  4.         {
  5.         case DL_ADC12_IIDX_MEM1_RESULT_LOADED:
  6.         //case DL_ADC12_IIDX_MEM0_RESULT_LOADED:
  7.                 gCheckADC = true;
  8.                 break;
  9.         default:
  10.                 break;
  11.         }
  12. }
main函数
  1. int main(void)
  2. {

  3.         uint16_t adc_value = 0;
  4.         uint16_t adc_ch3=0;
  5.         uint16_t i=0;
  6.         int a = 0;
  7.         SYSCFG_DL_init();
  8.         NVIC_EnableIRQ(ADC12_0_INST_INT_IRQN);
  9.         NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN);
  10.         NVIC_EnableIRQ(UART_0_INST_INT_IRQN);
  11.         DL_SYSCTL_disableSleepOnExit();
  12.         xdev_out(UART_0_write_Byte);//xprintf接口函数
  13.         gCheckADC = false;

  14.         while (1)
  15.         {
  16.                 i++;
  17.                 delay_cycles((32000));
  18.                 adc_value = Get_ADC(DL_ADC12_MEM_IDX_0);
  19.                 adc_ch3=Get_ADC(DL_ADC12_MEM_IDX_1);
  20.                 //UART_0_write_str(str);
  21.                 //UART_0_write_str("string send\n");
  22.                 //xprintf("xprintf :%d\n\r", i);

  23.                 if(adc_ch3>=3952) DL_GPIO_setPins(GPIOA, LED_GREEN_PIN_13_PIN);
  24.                 else  DL_GPIO_clearPins(GPIOA,LED_GREEN_PIN_13_PIN);
  25.                 //if(adc_ch3>=3952) xprintf("adc_ch3=%d",adc_ch3);
  26.                 DL_GPIO_clearPins(GPIOA,LED1_PIN_0_PIN );
  27.                 if(i>500)
  28.                 {
  29.                         //delay_cycles((32000 * 1000));
  30.                         i=0;
  31.                         xprintf("ADC0_3 :%d,Voltge=%f\n", adc_ch3,adc_ch3 * (3.3 / 4095) * 1000);
  32.                         xprintf("ADC0_2 :%d,Voltge=%f\n", adc_value,adc_value * (3.3 / 4095) * 1000);
  33.                         a = adc_value * (3.3 / 4095) * 1000;
  34.                         xprintf("get_temprature=%d℃\n",get_temprature(a)-40);//获取温度值方式1
  35.                         //xprintf("Tempreture=%d℃\n\n",TMP6131DECT_PTC_TEMP_TABLE[get_temprature(a)]);//获取温度值方式2
  36.                 }

  37.                 DL_GPIO_setPins(GPIOA,LED1_PIN_0_PIN );

  38.         }
  39. }


4、实验现象
串口实时打印2个ADC通道的数据(ADC值,电压,温度)
手遮住光敏传感器绿灯会亮起
哔哩哔哩演示视频



a3.png


5、源码
ADC.zip (202.57 KB, 下载次数: 6)



caigang13 发表于 2023-10-8 20:44 来自手机 | 显示全部楼层
CCS现在支持TI所有芯片开发了吗?我记得以前是只用于DSP开发的。
Tristan_C 发表于 2023-10-9 09:16 | 显示全部楼层
caigang13 发表于 2023-10-8 20:44
CCS现在支持TI所有芯片开发了吗?我记得以前是只用于DSP开发的。

现在支持芯片还是非常全的,很早前就支持了,MSP系列很多年以前,后来基本soc都可以
xyz549040622 发表于 2023-10-12 21:49 | 显示全部楼层
caigang13 发表于 2023-10-8 20:44
CCS现在支持TI所有芯片开发了吗?我记得以前是只用于DSP开发的。

CCS现在可以基本做到全系列支持了,当然除了很老的芯片。
xyz549040622 发表于 2023-10-12 21:52 | 显示全部楼层
楼主解析的很全面,从硬件都软件的解析都有,都很全面,那个xprintf函数是自己写的吗?有没有测试下是否支持printf函数呢?
 楼主| xiaoqi976633690 发表于 2023-10-13 09:24 | 显示全部楼层
xyz549040622 发表于 2023-10-12 21:52
楼主解析的很全面,从硬件都软件的解析都有,都很全面,那个xprintf函数是自己写的吗?有没有测试下是否支 ...

xprintf移植的,printf没有研究
https://bbs.21ic.com/icview-3331330-1-1.html
http://elm-chan.org/fsw/strf/xprintf.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

205

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部